面试常问的Linux命令
ls命令
语法格式
ls [参数] [文件名]
常用参数
-a | 显示所有文件及目录(包括隐藏文件) |
---|---|
-l | 显示文件的详细属性信息 |
-r | 依据首字母将文件以相反次序显示 |
-R | 递归显示所有子文件 |
-S | 依据内容大小将文件排序显示 |
-t | 根据最后修改时间将文件排序显示 |
常用命令
ls /www/logs:显示/www/logs目录下的文件
目录起始带了/,表示从根目录开始追溯;否则从当前目录开始
[root@test www]# ls /www/logs/
xx1-service xx2-service xx3-service
或
[root@test www]# ls logs/
xx1-service xx2-service xx3-service
ls -lrt:按照文件修改时间正序显示
ls -lt:按照文件修改时间倒序显示
[root@test www]# ls -lrt
total 0
drwxr-xr-x. 2 root root 29 Aug 17 23:22 arthas
lrwxrwxrwx. 1 root root 10 Aug 22 13:24 logs -> /data/logs
drwxr-xr-x. 5 bgshl nobody 51 Sep 4 16:48 eventtracking
drwxr-xr-x. 6 root root 98 Sep 7 13:58 service
[root@test www]# ls -lt
total 0
drwxr-xr-x. 6 root root 98 Sep 7 13:58 service
drwxr-xr-x. 5 bgshl nobody 51 Sep 4 16:48 eventtracking
lrwxrwxrwx. 1 root root 10 Aug 22 13:24 logs -> /data/logs
drwxr-xr-x. 2 root root 29 Aug 17 23:22 arthas
ll:ls -l命令的别名
[root@test]# ls -al
total 4
drwxr-xr-x 5 root root 68 Aug 22 13:28 .
dr-xr-xr-x. 21 root root 4096 Nov 19 08:24 ..
drwxr-xr-x. 2 root root 29 Aug 17 23:22 arthas
drwxr-xr-x. 5 bgshl nobody 51 Sep 4 16:48 eventtracking
lrwxrwxrwx. 1 root root 10 Aug 22 13:24 logs -> /data/logs
drwxr-xr-x. 6 root root 98 Sep 7 13:58 service
[root@test www]# ll -a
total 4
drwxr-xr-x 5 root root 68 Aug 22 13:28 .
dr-xr-xr-x. 21 root root 4096 Nov 19 08:24 ..
drwxr-xr-x. 2 root root 29 Aug 17 23:22 arthas
drwxr-xr-x. 5 bgshl nobody 51 Sep 4 16:48 eventtracking
lrwxrwxrwx. 1 root root 10 Aug 22 13:24 logs -> /data/logs
drwxr-xr-x. 6 root root 98 Sep 7 13:58 service
ls -Sl:按照文件夹大小,倒序排序
[root@test www]# ls -Sl
total 0
drwxr-xr-x. 6 root root 98 Sep 7 13:58 service
drwxr-xr-x. 5 bgshl nobody 51 Sep 4 16:48 eventtracking
drwxr-xr-x. 2 root root 29 Aug 17 23:22 arthas
lrwxrwxrwx. 1 root root 10 Aug 22 13:24 logs -> /data/logs
[root@test www]# du -sh ./\*
140K ./arthas
72M ./eventtracking
0 ./logs
552M ./service
ls -lh:以KB、MB等为单位进行显示
[xx@test www]# ls -lh
total 864K
drwxrwxrwx 4 nobody nobody 246 Jul 1 2020 config
drwxrwxrwx 16 nobody nobody 232 Aug 23 2021 controller
drwxrwxrwx 33 nobody nobody 4.0K May 11 2021 cron
-rwxrwxrwx 1 nobody nobody 17K May 13 2021 e.txt
-rw-r--r-- 1 apache apache 76 Jul 27 2021 error
drwxrwxrwx 6 nobody nobody 4.0K May 18 2020 files
drwxrwxrwx 6 nobody nobody 202 Apr 21 2020 frontsrc
drwxrwxr-x 4 bgshl nobody 131 Jul 11 19:17 ims
drwxr-xr-x 3 nobody nobody 16 May 19 2020 inc
drwxrwxrwx 68 root root 4.0K Jul 2 15:07 logs
drwxrwxrwx 13 nobody nobody 160 Apr 21 2020 model
drwxrwxrwx 3 nobody nobody 4.0K May 19 2020 public
-rwxrwxrwx 1 nobody nobody 301K Dec 1 2021 request.txt
drwxrwxrwx 14 nobody nobody 179 Jul 27 2021 resources
drwxrwxrwx 6 nobody nobody 154 Sep 10 2020 routes
drwxrwxrwx 16 nobody nobody 217 Mar 30 2021 system
-rwxrwxrwx 1 apache apache 47K Jul 2 2021 t.txt
drwxr-xr-x 3 nobody nobody 4.0K Jun 22 2021 test
drwxr-xr-x 2 nobody nobody 4.0K Jun 29 2021 tmp
-rwxrwxrwx 1 nobody nobody 463K Dec 20 2021 vapi.txt
ll命令结果说明
drwxr-xr-x 2 root root 48 2013-11-27 16:34 test/
-
第一个栏位,表示文件的属性。Linux的文件基本上分为三个属性:可读(r),可写(w),可执行(x)。这里有10个位置(具体程序实现时,实际上是十个bit位)。
- 第一个字母表示文件类型,
-
”-”,普通文件.
-
”d”目录,字母”d”,是dirtectory(目录)的缩写.
-
“l”符号链接。一个目录或者说一个文件夹是一个特殊文件,这个特殊文件存放的是其他文件和文件夹的相关信息。比如上述命令中的:logs -> /data/logs 是指logs目录链接到/data/logs目录下,可以直接到logs目录下查看到文件,但是实际文件在data/logs。
-
“b”块设备文件。
-
“c”字符设备文件。
-
- 紧接着的3*3个字符分3组,各指此文件分别对于owner、group、others的读、写、执行权限。
- rwx(Owner)r-x(Group)r-x(Other) 这个例子表示的权限是:1)使用者自己可读,可写,可执行;2)同一组的用户可读,不可写,可执行;3)其它用户可读,不可写,可执行。另外,有一些程序属性的执行部分不是X,而是S,这表示执行这个程序的使用者,临时可以有和拥有者一样权力的身份来执行该程序。一般出现在系统管理之类的指令或程序,让使用者执行时,拥有root身份。
- 第一个字母表示文件类型,
-
第二个栏位,表示文件个数。如果是文件的话,那这个数目自然是1了,如果是目录的话,那它的数目就是该目录中的文件个数了。
-
第三个栏位,表示该文件或目录的拥有者。若使用者目前处于自己的Home,那这一栏大概都是它的账号名称。
-
第四个栏位,表示所属的组(group)。每一个使用者都可以拥有一个以上的组,不过大部分的使用者应该都只属于一个组,只有当系统管理员希望给予某使用者特殊权限时,才可能会给他另一个组。
-
第五栏位,表示文件大小。文件大小用byte来表示,而空目录一般都是1024byte,当然可以用其它参数使文件显示的单位不同。
-
第六个栏位,表示最后一次修改时间。以“月,日,时间”的格式表示,如Aug 15 5:46表示8月15日早上5:46分。
-
第七个栏位,表示文件名。我们可以用ls –a显示隐藏的文件名。
查看文件夹大小
du命令(disk usage)
有时候记不住du和df命令。只需要记住:
- disk usage:已使用的容量,即文件本身大小。
- disk free:可用容量
-
du -sh:查看当前目录总共占的容量,不单独列出各个目录占用的容量
-
du -sh ./*:单独列出当前子目录占用的容量
-
du -sh [文件夹]:查看指定文件夹占用的容量,使用绝对路径或直接使用当前目录下的子目录
参数解释:
-
-h:以K、M、G为单位,提高信息的可读性
-
-s:仅显示总计
实战
[xx@test /]# cd /www
# ll命令
[xx@test www]# ll
total 0
drwxr-xr-x. 2 root root 29 Aug 17 23:22 arthas
drwxr-xr-x. 5 bgshl nobody 51 Sep 4 16:48 eventtracking
lrwxrwxrwx. 1 root root 10 Aug 22 13:24 logs -> /data/logs
drwxr-xr-x. 6 root root 98 Sep 7 13:58 service
# du命令
[xx@test www]# du -sh
624M .
[xx@test www]# du -sh ./*
140K ./arthas
72M ./eventtracking
0 ./logs
552M ./service
[xx@test www]# du -sh service/
552M service/
[xx@test www]# du -sh /www/service/
552M /www/service/
[xx@test www]# du -sh /www/logs/
170G /www/logs/
[xx@test logs]# du -sh ./*
7.1G ./xx-executor
158G ./xx1-service
12M ./xx2-service
1.5G ./xx3
16K ./xx4-service
[xx@test www]# du -h ./*
8.0K ./common/config/..2024_07_10_10_09_45.2860291022
8.0K ./common/config
8.0K ./common
39M ./eventtracking/sensorsdata
60K ./eventtracking/logs/202407
60K ./eventtracking/logs
16K ./eventtracking/xx/202407
16K ./eventtracking/pluslogs
28K ./eventtracking/cupid/event
2.7M ./eventtracking/cupid/202407
2.7M ./eventtracking/cupid
1.5M ./eventtracking/xx/202407
1.5M ./eventtracking/xx
43M ./eventtracking
1.1G ./logs/xx1-service/rolling
1.4G ./logs/xx1-service
0 ./logs/xx-executor/xx1-service/xxl-job/jobhandler/gluesource
36M ./logs/xx-executor/xx1-service/xxl-job/jobhandler/2024-07-10
158M ./logs/xx-executor/xx1-service/xxl-job/jobhandler
158M ./logs/xx-executor/xx1-service/xxl-job
158M ./logs/xx-executor/xx1-service
158M ./logs/xx-executor
1.5G ./logs
ll命令和du命令显示的文件夹大小不一致
[xx@test www]# du -sh ./*
64K ./config
1.3M ./controller
1.9G ./cron
20K ./e.txt
4.0K ./error
4.9G ./files
281M ./frontsrc
30M ./ims
208K ./inc
1.4G ./logs
364K ./model
3.0M ./public
304K ./request.txt
40M ./resources
512K ./routes
212M ./system
48K ./t.txt
636K ./test
2.0M ./tmp
464K ./vapi.txt
[xx@test www]#ls -lh
total 864K
drwxrwxrwx 4 nobody nobody 246 Jul 1 2020 config
drwxrwxrwx 16 nobody nobody 232 Aug 23 2021 controller
drwxrwxrwx 33 nobody nobody 4.0K May 11 2021 cron
-rwxrwxrwx 1 nobody nobody 17K May 13 2021 e.txt
-rw-r--r-- 1 apache apache 76 Jul 27 2021 error
drwxrwxrwx 6 nobody nobody 4.0K May 18 2020 files
drwxrwxrwx 6 nobody nobody 202 Apr 21 2020 frontsrc
drwxrwxr-x 4 bgshl nobody 131 Jul 11 19:17 ims
drwxr-xr-x 3 nobody nobody 16 May 19 2020 inc
drwxrwxrwx 68 root root 4.0K Jul 2 15:07 logs
drwxrwxrwx 13 nobody nobody 160 Apr 21 2020 model
drwxrwxrwx 3 nobody nobody 4.0K May 19 2020 public
-rwxrwxrwx 1 nobody nobody 301K Dec 1 2021 request.txt
drwxrwxrwx 14 nobody nobody 179 Jul 27 2021 resources
drwxrwxrwx 6 nobody nobody 154 Sep 10 2020 routes
drwxrwxrwx 16 nobody nobody 217 Mar 30 2021 system
-rwxrwxrwx 1 apache apache 47K Jul 2 2021 t.txt
drwxr-xr-x 3 nobody nobody 4.0K Jun 22 2021 test
drwxr-xr-x 2 nobody nobody 4.0K Jun 29 2021 tmp
-rwxrwxrwx 1 nobody nobody 463K Dec 20 2021 vapi.txt
这是因为"ls"命令显示的是文件实际大小,而"du"命令显示的是文件所占用的磁盘空间大小。
文件系统中的文件可能会占用比它们的实际大小更多的磁盘空间,这是因为文件系统使用块作为最小单位来存储数据。即使文件大小不足一个块,它仍然会占用一个完整的块。因此,文件的磁盘空间大小通常会略微大于其实际大小
查看磁盘剩余空间
df命令(disk free)
df -hl [目录名]:查看指定目录下的磁盘剩余空间
实战
[root@test debug]# pwd
/data/logs/im-chat-service/202311/debug
[root@test debug]# df -hl /www/logs
Filesystem Size Used Avail Use% Mounted on
/dev/sdb1 197G 168G 19G 90% /data
查看文件中的指定行
head:查看文件前几行
# 查看文件的前10行内容
[root@test debug]# head -n 10 sa.log.2024-07-12-10
# 查看文件中除了最后10行的全部内容
# 如果文件总共x行,则查看的是前x-10行的内容
[root@test debug]# tail -n -10 sa.log.2024-07-12-10
tail:查看文件后几行
# 查看文件后10行
[root@test debug]# tail -n 10 sa.log.2024-07-12-10
# 查看文件从第10行开始的所有内容(包含第10行)
[root@test debug]# tail -n +10 sa.log.2024-07-12-10
sed:查看文件指定行
# 查看文件第5到第10行
[root@test debug]# sed -n '5, 10p' sa.log.2024-07-12-10
# 使用head和tail结合
[root@test debug]# cat sa.log.2024-07-12-10 | head -n 10 | tail -n +5
netstat 网络相关
[root@test debug]# netstat -nptl //查看当前所有tcp端口
[root@test debug]# netstat -nptl | grep 16800 //查看16800端口是哪个进程占用
[root@test debug]# ps -ef | grep 16800 //查看16800端口是对应哪个服务
Linux三剑客
BRE基本正则和扩展正则
- ^abc,表示:以abc开头的字符串
- abc$,表示:以abc结尾的字符串
- [a-z][0-9]区间,如果开头带有^ ,表示不能匹配区间内的元素
- * 表示0个或者多个
- . 表示任意字符
- ? 非贪婪匹配
- + 一个或多个
- () 分组
- {} 范围约束
- | 匹配多个表达式的任何一个
- ~ 匹配正则表达式
- !~ 不匹配正则表达式
awk
数据切片,类比SQL
select field from table
命令格式
awk options 'pattern {action}' file
options
:是一些选项,用于控制awk
的行为。pattern
:是用于匹配输入数据的模式。如果省略,则awk
将对所有行进行操作。{action}
:是在匹配到模式的行上执行的动作。如果省略,则默认动作是打印整行。
awk常见的内建变量
- F <分隔符>: 指定输入字段的分隔符,默认是空格。使用这个选项可以指定不同于默认分隔符的字段分隔符。如果以空格分隔,则可省略-F " "。
- FS:列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同
- NF:当前处理的行的字段个数。
- NR:当前处理的行的行号(序数)。
- $0:当前处理的行的整行内容。
- $n:当前处理行的第n个字段(第n列)。
- FILENAME:被处理的文件名。
- RS:行分隔符。awk从文件上读取资料时,将根据RS的定义把读取的资料切割成许多条记录,而awk一次仅读入一条记录,以进行处理。预设值是’\n’
awk 'NR==1,NR==3 {print}' name.txt #输出第 1~3 行内容
awk 'NR==1;NR==3 {print}' name.txt #输出第 1和第3 行内容
awk '(NR>=1)&&(NR<=3) {print}' name.txt #输出第 1~3 行内容
awk 'NR==1||NR==3{print}' name.txt #输出第1行、第3行内容
awk '(NR%2)==1{print}' name.txt #输出所有奇数行的内容
awk '(NR%2)==0{print}' name.txt #输出所有偶数行的内容
awk '/^root/{print}' /etc/passwd #输出以root开头的行
awk '/nologin$/{print}' /etc/passwd #输出以nologin结尾的行
#统计以/bin/bash 结尾的行数,等同于 grep -c "/bin/bash$" /etc/passwd
awk 'BEGIN {x=0};/\/bin\/bash$/{x++};END {print x}' /etc/passwd
#输出第3个字段的值小于5的第1、3个字段内容
awk -F ":" '$3<5{print $1,$3}' /etc/passwd
#根据文件内容对当前目录下的文件进行过滤,以下3种方式都是等价的
ll | awk '{print $9}' | awk -F "." '{print $3}'
ll | awk '{print $9}' | awk -F . '{print $3}'
ll | awk '{print $9}' | awk 'BEGIN{FS="."}{print $3}'
注意:BEGIN模式表示,在处理指定的文本之前,需要先执行BEGIN模式中指定的动作;awk再处理指定的文本,之后再执行END模式中指定的动作,END{}语句块中,往往会放入打印结果等语句。
grep
数据查找定位,类比SQL
select * from table like '%xx'
sed
数据修改
update table set field = new where field = old
实战
以下是nginx.log文件的部分内容
223.104.7.59 - - [05/Dec/2018:00:00:01 +0000] "GET /topics/17112 HTTP/2.0" 200 9874 "https://www.googleapis.com/auth/chrome-content-suggestions" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/70.0.3538.75 Mobile/15E148 Safari/605.1" 0.040 0.040 .
123.125.71.60 - - [05/Dec/2018:00:00:02 +0000] "GET /yuanyibo/topics?locale=en HTTP/1.1" 200 12164 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" 0.032 0.032 .
141.8.142.131 - - [05/Dec/2018:00:00:02 +0000] "GET /topics?page=63 HTTP/1.1" 200 16739 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)" 0.120 0.120 .
139.180.131.123 - - [05/Dec/2018:00:00:01 +0000] "GET /cable HTTP/1.1" 101 15073 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" 592.015 592.015 .
40.77.167.60 - - [05/Dec/2018:00:00:03 +0000] "GET /hehe123 HTTP/1.1" 200 3494 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)" 0.033 0.033 .
204.141.42.226 - - [05/Dec/2018:00:00:04 +0000] "GET / HTTP/1.1" 301 5 "-" "Site24x7" 0.002 0.002 .
40.77.167.60 - - [05/Dec/2018:00:00:04 +0000] "GET /uploads/user/avatar/11094.jpg!xs HTTP/1.1" 200 1499 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)" 0.011 0.011 .
127.0.0.1 - - [05/Dec/2018:00:00:04 +0000] "GET /_img/uploads/user/avatar/11094.jpg!xs HTTP/1.0" 200 1499 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)" 0.011 - .
139.180.131.123 - - [05/Dec/2018:00:00:01 +0000] "GET /cable HTTP/1.1" 101 7549 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" 587.602 587.602 .
117.136.39.87 - - [05/Dec/2018:00:00:01 +0000] "GET /uploads/user/avatar/12759.jpg!large HTTP/1.1" 200 1866441 "-" "okhttp/3.2.0" 3.910 1.336 .
121.15.166.147 - - [05/Dec/2018:00:00:07 +0000] "GET /cable HTTP/1.1" 101 335037 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36" 26471.138 26471.138 .
219.142.131.122 - - [05/Dec/2018:00:00:07 +0000] "GET /cable HTTP/1.1" 101 361523 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.103 Safari/537.36 Vivaldi/2.1.1337.47" 28563.286 28563.286 .
61.132.54.2 - - [05/Dec/2018:00:00:07 +0000] "GET /cable HTTP/1.1" 101 380979 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36" 30102.676 30102.676 .
103.75.152.102 - - [05/Dec/2018:00:00:07 +0000] "GET /cable HTTP/1.1" 101 424907 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" 33572.810 33572.810 .
222.66.96.129 - - [05/Dec/2018:00:00:07 +0000] "GET /cable HTTP/1.1" 101 424907 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" 33573.471 33573.471 .
...
找出log中的404 500的报错
# 1. 先找到状态码在第几列
[root@test debug]# awk -F " " '{print $9}' nginx.log
200
404
500
...
# 方式1. 直接上上述结果中过滤出来404和500的9(这个其实没有真正将404和500的错误打印出来)
[root@test debug]# awk -F " " '{print $9}' nginx.log | grep 404
[root@test debug]# awk -F " " '{print $9}' nginx.log | grep 500
或者省略-F " "
[root@test debug]# awk '{print $9}' nginx.log | grep 404
# 方式2. 写表达式:打印第9列的值为404或500的行
[root@test debug]# awk '$9~/404|500/' nginx.log
或者不省略执行的动作
[root@test debug]# awk '$9~/404|500/{print}' nginx.log
找出500错误时候的上下文
# 找出500错误时候的前2行
[root@test debug]# grep -B 2 ' 500 ' nginx.log
...
找出访问量最高的ip
# 1. 打印出来ip
[root@test debug]# awk '{print $1}' nginx.log
# 2. 对ip进行排序并去重,统计并打印每个ip出现次数
[root@test debug]# awk '{print $1}' nginx.log | sort | uniq -c
110 127.0.0.1
130 136.243.151.93
74 144.76.81.72
282 216.244.66.241
# 3. 对上述输出结果倒序(即按照第1列的次数进行排序)
[root@test debug]# awk '{print $1}' nginx.log | sort | uniq -c | sort -nr
282 216.244.66.241
130 136.243.151.93
110 127.0.0.1
74 144.76.81.72
# 4. 取上述结果中的前3个
[root@test debug]# awk '{print $1}' nginx.log | sort | uniq -c | sort -nr | head -n 3
282 216.244.66.241
130 136.243.151.93
110 127.0.0.1
找出/topics的平均响应时间
# 1. 先精准过滤出/topics 接口的调用记录
[root@test debug]# awk '$7=="/topics"' nginx.log
144.76.81.72 - - [05/Dec/2018:00:02:16 +0000] "GET /topics HTTP/1.1" 200 16618 "-" "Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)" 0.144 0.144 .
220.243.135.165 - - [05/Dec/2018:00:05:02 +0000] "GET /topics HTTP/1.1" 200 16686 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.5399.672 Safari/537.36" 0.067 0.067 .
180.169.86.98 - - [05/Dec/2018:00:08:53 +0000] "GET /topics HTTP/1.1" 200 17098 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36" 0.087 0.087 .
220.243.136.59 - - [05/Dec/2018:00:11:05 +0000] "GET /topics HTTP/1.1" 200 16595 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.8670.694 Safari/537.36" 0.076 0.076 .
# 2. 打印出上述记录中的响应时间,NF-1是最后一列
[root@test debug]# awk '$7=="/topics"' nginx.log | awk '{print $(NF-1)}'
0.144
0.067
0.087
0.076
# 3. 计算上述数值的和并打印出来
[root@test debug]# awk '$7=="/topics"' nginx.log | awk '{print $(NF-1)}' | awk '{t+=$1}END{print t}'
0.374
# 4. 计算上述数值的平均值并打印出来,NR表示记录数
[root@test debug]# awk '$7=="/topics"' nginx.log | awk '{print $(NF-1)}' | awk '{t+=$1}END{print t/NR}'
0.0935
找出访问量最高的页面地址
一些面试题
根据文件名称模糊匹配批量删除文件
方式一:find命令模糊匹配文件名
# 先查找到要删除的文件
[root@test debug]# find . -name 'debug-2023-11-20\*'
./debug-2023-11-20-01-2.log
./debug-2023-11-20-02-1.log
./debug-2023-11-20-06-1.log
./debug-2023-11-20-04-2.log
./debug-2023-11-20-05-2.log
./debug-2023-11-20-03-2.log
./debug-2023-11-20-09-2.log
./debug-2023-11-20-02-2.log
./debug-2023-11-20-01-1.log
./debug-2023-11-20-00-2.log
./debug-2023-11-20-07-2.log
./debug-2023-11-20-05-1.log
./debug-2023-11-20-08-1.log
./debug-2023-11-20-04-1.log
./debug-2023-11-20-09-1.log
./debug-2023-11-20-00-1.log
./debug-2023-11-20-03-1.log
./debug-2023-11-20-06-2.log
./debug-2023-11-20-08-2.log
./debug-2023-11-20-07-1.log
# 在上述命令后面,加上-exec 执行批量删除
[root@test debug]# find . -name 'debug-2023-11-20\*' -exec rm {} ;
方式二:利用awk
# 1. 先找出来文件的日期后缀
[root@test debug]# ll | awk '{print $9}' | awk -F . '{print $3}'
# 2. 打印出来要删除的文件
[root@test debug]# ll | awk '{print $9}' | awk -F . '$3>"2024-07-13-10"{print}'
sa.log.2024-07-13-11
sa.log.2024-07-13-12
sa.log.2024-07-13-13
sa.log.2024-07-13-14
sa.log.2024-07-13-15
sa.log.2024-07-13-18
# 3. 打印出来要删除的文件
[root@test debug]# ll | awk '{print $9}' | awk -F . '$3>"2024-07-13-10"{print}'
# 4. 打印删除命令
[root@test debug]# ll | awk '{print $9}' | awk -F . '$3>"2024-07-13-10" {print "rm -rf " $0}'
rm -rf sa.log.2024-07-13-18
# 5. 加sh,执行命令,即可将文件删除
[root@test debug]# ll | awk '{print $9}' | awk -F . '$3>"2024-07-13-10" {print "rm -rf " $0}' | sh
过滤符合条件的日志
[root@test debug]# cat sa.log.2024-05-28-16 | grep ChatMessageRenew | grep "ehire31623897_c242637064" | grep ChatMessageRenew
查看某个文件夹的空间大小
用du命令,du -sh [文件目录]
统计一个文件中某个字符串出现的次数
# grep -i 不区分大小写
[root@test sensorsdata]# grep -i "_Track_id" sa.log.2024-07-11-20 | wc -l
18
# grep 区分大小写
[root@test sensorsdata]# grep "_track_id" sa.log.2024-07-11-20 | wc -l
18
#加多个过滤条件
[root@test sensorsdata]# cat sa.log.2024-05-28-16 | grep "ChatMessageRenew" | grep "123" | wc -l
# 显示行号
[root@test sensorsdata]# grep -n "_track_id" sa.log.2024-07-11-20
1:{"_track_id":-431586906,"lib":{"$lib":"Java","$lib_method":"code","$lib_version":"3.4.5","$lib_detail":"com.sensorsdata.analytics.javasdk.SensorsAnalytics##addEvent##SensorsAnalytics.java##480"},"distinct_id":"1623428"}}
2:{"_track_id":-484706451,"lib":{"$lib":"Java","$lib_method":"code","$lib_version":"3.4.5","$lib_detail":"com.sensorsdata.analytics.javasdk.SensorsAnalytics##addEvent##SensorsAnalytics.java##480"},"distinct_id":"1623428"}}
使用awk命令查出所有进程的端口号,然后kill这些进程
# 1. 查找所有java进程
[root@test ~]# ps -ef|grep java
bgshl 1716 1 1 Apr15 ? 1-05:34:27 java -classpath /usr/local/log_agent/bin/../lib/logagent-1.0-SNAPSHOT.jar -Dsa.root.logger=DEBUG,DRFA,console -Dsa.log.file=/usr/local/log_agent/bin/../log/logagent.log -Dsa.log.last.error.size=50 -Dsa.log.maxBackupIndex=60 -Dfile.encoding=UTF-8 -Xms192m -Xmx192m -Xmn128m -XX:ParallelGCThreads=3 com.sensorsdata.logagent.LogAgentMain --pid_file /usr/local/log_agent/bin/../logagent.pid
user1 20606 24822 0 19:04 pts/0 00:00:00 grep --color=auto java
# 2. 去除grep命令进程
[root@test ~]# ps -ef|grep java | grep -v grep
bgshl 1716 1 1 Apr15 ? 1-05:34:30 java -classpath /usr/local/log_agent/bin/../lib/logagent-1.0-SNAPSHOT.jar -Dsa.root.logger=DEBUG,DRFA,console -Dsa.log.file=/usr/local/log_agent/bin/../log/logagent.log -Dsa.log.last.error.size=50 -Dsa.log.maxBackupIndex=60 -Dfile.encoding=UTF-8 -Xms192m -Xmx192m -Xmn128m -XX:ParallelGCThreads=3 com.sensorsdata.logagent.LogAgentMain --pid_file /usr/local/log_agent/bin/../logagent.pid
# 3. 打印进程id
[root@test ~]# ps -ef|grep java | grep -v grep | awk '{print $2}'
1716
# 4. 打印命令
[root@test ~]# ps -ef|grep java | grep -v grep | awk '{print "sudo kill " $2}'
sudo kill 1716
# 5. 加上sh,即可直接执行命令kill进程
[root@test ~]# ps -ef|grep java | grep -v grep | awk '{print "sudo kill " $2}' | sh
参考文章
转载自:https://juejin.cn/post/7390686791776337947