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中包含的内置变量
- $0 当前记录(这个变量中存放着整个行的内容)
$1~$n
当前记录的第n个字段,字段间由FS分隔FS
输入字段分隔符 默认是空格或Tab- NF 当前记录中的字段个数,就是有多少列
NR
已经读出的记录数
,就是行号,从1开始
,如果有多个文件话,这个值也是不断累加中。FNR
当前记录数,与NR不同的是,这个值会是各个文件自己的行号
- RS 输入的记录分隔符, 默认为换行符
- OFS 输出字段分隔符, 默认也是空格
- ORS 输出的记录分隔符,默认为换行符
- 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 #取前三名
参考: