★★Linux文本分析常用命令--grep\sed\awk\find\wc\uniq\sort\head

olivee 4年前 ⋅ 1158 阅读

1. grep

常用参数: -v 取反 -i 忽略大小写 -c 符合条件的行数 -C NUM 显示符合条件行的前后NUM行 -n 输出的同时打印行号 ^* 以*开头
$ 以结尾 ^$ 空行 E 把文件名也打印出来

查询当前目录下查找“*.sh”中包含a的行,并显示文件名和行号

grep -nE "a" *.sh 

递归查询当前目录下查找“*.yml”中包含a的行,并显示文件名和行号

grep -RnE --include=*.yml "a" 

显示当前目录下查找“*.sh”中包含all的行,并显示其前后两行和行号

grep -n -2 "all" *.sh

grep -v 取反,显示不包括某些内容的行(如下表示显示不包括a的行)

grep -n -v "a" *.sh

grep -c 显示匹配到的行数(如下表示显示各个.sh文件中包含a字符的行数)

grep -c "a" *.sh

2. sed

文件内容替换

sed -i 's/this/This/g' test.txt

  • -i 表示替换后并写入到文件

  • s/ 表示替换指令

  • /g 表示全部替换,如果不写就表示只替换第一行第一个匹配项

  • this/This 表示把this替换为This

删除多行

删除file.txt的1~3行

sed -i '1,3d' file.txt

-i 选项用于直接修改原文件

删除file.txt第4行及之后的所有行

sed -i '4,$d' file.txt

$表示文件的最后一行

3. awk

awk --help

Usage: awk [POSIX or GNU style options] -f progfile [--] file ...

Usage: awk [POSIX or GNU style options] [--] 'program' file ...

POSIX options:

  • -f progfile --file=progfile
  • -F fs --field-separator=fs ,字段分隔符:默认是空格或Tab。如“-F:”表示以冒号为分隔
  • -v var=val --assign=var=val

awk 'BEGIN{ commands } pattern{ commands } END{ commands }'

  • 第一步:运行BEGIN{ commands }语句块中的语句。

  • 第二步:从文件或标准输入(stdin)读取一行。然后运行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行反复这个过程。直到文件所有被读取完成。

  • 第三步:当读至输入流末尾时运行END{ commands }语句块。

BEGIN语句块在awk開始从输入流中读取行之前被运行,这是一个可选的语句块,比方变量初始化打印输出表格的表头等语句通常能够写在BEGIN语句块中。

END语句块在awk从输入流中读取全然部的行之后即被运行。比方打印全部行的分析结果这类信息汇总都是在END语句块中完毕,它也是一个可选语句块。

pattern中包含的内置变量

  1. $0 当前记录(这个变量中存放着整个行的内容)
  2. $1~$n 当前记录的第n个字段,字段间由FS分隔
  3. FS 输入字段分隔符 默认是空格或Tab
  4. NF 当前记录中的字段个数,就是有多少列
  5. NR 已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。
  6. FNR 当前记录数,与NR不同的是,这个值会是各个文件自己的行号
  7. RS 输入的记录分隔符, 默认为换行符
  8. OFS 输出字段分隔符, 默认也是空格
  9. ORS 输出的记录分隔符,默认为换行符
  10. FILENAME 当前输入文件的名字

如打印每一行的行数:

# ls -lh | awk '{print NR " " $1}'
1 total
2 -rwxr-xr-x
3 -rwxr-xr-x
4 -rw-r--r--
5 -rwxr-xr-x
6 -rwxr-xr-x
7 -rwxr-xr-x
8 -rw-r--r--
9 -rw-r--r--
10 -rw-r--r--
11 -rw-r--r--
12 -rwxr-xr-x
13 -rwxr-xr-x
14 -rwxr-xr-x
15 -rwxr-xr-x
16 -rwxr-xr-x
17 -rwxr-xr-x
18 -rwxr-xr-x

再比如:

# awk  -F ':'  '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
filename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/usr/sbin/nologin
filename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/usr/sbin/nologin
filename:/etc/passwd,linenumber:5,columns:7,linecontent:sync:x:4:65534:sync:/bin:/bin/sync
filename:/etc/passwd,linenumber:6,columns:7,linecontent:games:x:5:60:games:/usr/games:/usr/sbin/nologin

BEGIN中加入自定义变量

如下引入变量sum,统计py文件的大小:

# ls -l  *.py | awk '{sum+=$5} END {print sum}'
574

语句

如: 使用数组,统计重复出现的次数:

[root@localhost cc]# cat test.txt
a 00
b 01
c 00
d 02
[root@localhost cc]# awk '{sum[$2]+=1}END{for(i in sum)print i"\t"sum[i]}' test.txt
00 2
01 1
02 1

过滤 日志内容并统计

如: 去除access文件中URL中以/static/开头的URL

awk '($7 !~ /^\/static\//){print $0}' access_2013_05_30.log > clean_2013_05_30.log

如: 去除ccess文件中URL中以为图片、css和js

awk '($7 !~ /\.jpg|\.png|\.jpeg|\.gif|\.css|\.js/) {print $0}' clean_2013_05_30.log > clean2_201 3_05_30.log

统计pv:

awk 'BEGIN{pv=0}{pv++}END{print "pv:"pv}' clean2_2013_05_30.log > pv_2013_05_30

4. find

递归查找(find 命令 是递归遍历文件夹的)

当前路径下递归查找以.txt结尾的文件夹

find . -name “*.txt”

不递归查找

当前路径下不递归查找以.txt结尾的文件夹,-maxdepth 1表示查找深度为1

find . -name “*.txt” -maxdepth 1

5. wc

wc -l #统计行数

6. uniq

uniq -c #在输出行前面加上每行在输入文件里出现的次数

uniq -u #仅显示不反复的行

7. sort

sort -nr

  • -n:按照数值的大小排序
  • -r:以相反的顺序来排序
  • -k:按照哪一列进行排序

8. head

head -3 #取前三名

参考: