史上最详细的linux三剑客讲解-grep-awk-sed
对于运维工程师来讲,日常用到的最多的文件处理工具就是grep、awk及sed了,下面我们以具体的例子进行详细讲解
grep
格式
grep [acivn] [--color=auto] '搜寻字符串'
参数
-a
:将binary文件以text文件的方式搜寻-c
:计算到'搜寻字符串'的次数-i
:忽略大小写-n
:输出行号-v
:反向选择--color=auto:
可以将找到的关键字部分加上颜色显示
示例
-
将
/etc/passwd
有出现root
的行取出来grep 'root' /etc/passwd
-
将
/etc/passwd
有出现root
的行取出来,同时显示这些行在/etc/passwd
的行号grep -n 'root' /etc/passwd
-
将
/etc/passwd
没有出现root
的行取出来grep -v 'root' /etc/passwd
-
将
/etc/passwd
,没有出现root
和nologig
的行取出来grep -v 'root' /etc/passwd|grep -v 'nologin'
-
用demege列出核心信息,再以grep找出内涵eth那行,且加上行号来显示
dmesg|grep -n 'eth'
-
根据文件内容递归查找目录
在当前目录搜素energywise行的文件
grep energywise .
在当前目录及其子目录搜索energewise行的文件
grep -r energewise ./
在当前目录及其子目录下搜素energywise行的文件,只显示匹配的文件
grep -r -1 energewise
-
搜索
test
和tast
字符串grep 't[ae]st' file.txt
-
字符串反向选择[^]:如果想要搜索到有
oo
的行,但不想要oo
前面有g
grep -n '[^g]oo' file.txt
-
oo
前面不出现小写字节grep -n '[^a-z]oo' file.txt
-
想要取得有数字的行
grep -n '[0-9]' file.txt
-
搜索出以
the
开头的行grep -n '^the' file.txt
-
搜索以小写字母开头的行
grep -n '[a-z]' file.txt
-
搜索出非字母开头的行
grep -n '[^a-zA-Z]' file.txt
-
末尾结束为小数点(.)的行
grep -n '\.$' file.txt
-
找出空白行
grep -n '^$' file.txt
-
找出'g??d'的字符串
grep -n 'g??d' file.txt
-
至少出现两个o,就需要ooo(代表重复0个或多个前面的字符)
grep -n 'ooo*' file.txt
-
开头结尾都是g,中间至少,中间至少一个o
grep -n 'goo*g' file.txt
-
g开头g结尾,当中的字符有无均可
grep -n '^g.*g$' file.txt
-
找出任意有数字的行
grep -n '[0-9][0-9]*' file.txt
-
找到两个连续o的字符串
grep -n 'o\{2\}' file.txt
-
搜索出g后面接2-5个o,然后再接一个g的字串
grep -n 'g\{2,5\}g' file.txt
-
两个以上的gooo...g
grep -n 'go\{2,\}g' file.txt
grep -n 'gooo*g' file.xttx
扩展grep(grep -E或者egrep)
-
打印所有包含
NW
或EA
的行egrep 'NW|EA' file.txt
-
对于标准grep,如果在扩展字符前面加入
\
,grep会自动启用扩展选项-E
grep 'NW\|EA' file.txt
-
搜索一个或多个w的行
grep 'w\+' file.txt
grep -E 'w+' file.txt
egrep 'w+' file.txt
- 搜索一个或者多个连续的no行
grep '\(no\)+' file.txt
grep -E '\(no\)+' file.txt
erep '(no)+' file.txt
-
匹配上下文分别显示3行
grep -C 'good' file.txt
-
只匹配整个单词而不是字符串的一部分(而不是magical)
grep -w 'magic' file.txt
-
只匹配man
grep '\<man\>' file.txt
awk
实例
awk实例:
-F指定分隔符,可指定一个或多个
1、# awk -F":" '{print $1}' /etc/passwd
2、# awk -F":" '{print $1 $3}' /etc/passwd
3、# awk -F":" '{print $1 " " $3}' /etc/passwd
4、# awk -F":" '{print "username:" $1 "\t\tuid:" $3}' /etc/passwd
5、# awk -F'[: ]+' '{print $3;}' /data
6只查看test.txt文件(100行)内第20到第30行的内容
# awk '{if(NR>=20 &&NR<=30) print $1}' test.txt
7、已知test.txt文件内容为:
# cat test.txt
I am Poe,my qq is 33794712
请从该文件中过滤出'Poe'字符串与33794712,最后输出的结果为:Poe 33794712
# awk -F'[ ,]+' '{print $3" "$7}' test.txt
8、统计/etc/passwd的账户人数
# awk '{count++;print $0;} END{print "user count is ",count}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
..............................................
user count is 27
9、显示最近登入的5个账号
# last -n 5 | awk '{print $1}'
10、显示/etc/passwd的账户
# cat /etc/passwd | awk -F':' '{print $1}'
11、显示/etc/passwd的账户和账户对应的shell,而账户与shell之间用tab键分割
# cat /etc/passwd | awk -F':' '{print $1"\t"$7}'
12、如果只显示/etc/passwd的账户和对应的shell,而账户与shell之间以逗号分割,而且所在的行添加name,shell,在最后一行添加"blue,/bin/bash".
# cat /etc/passwd|awk -F':' 'BEGIN{print "name,shell"} {print $1","$7} END{print "blue,/bin/bash"}'
13、搜索/etc/passwd有root关键字的所有行
# awk -F':' '/root/' /etc/passwd
14、统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:
# awk -F':' '{print "filename:" FILENAME,"linenumber:" NR,"columns:" NF,"linecontent:" $0}' /etc/passwd
# awk -F':' '{printf("filename:%s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
15、统计/etc/passwd的账户人数
awk '{count++;print $0;} END{print "user count is ",count}' /etc/passwd
16、上面没有对count进行初始化
awk 'BEGIN{count=0;print "[start]user count is ",count} {count=count+1;print $0} END{print "[end]user is ",count }' /etc/passwd
17、统计某个文件夹下的文件占用字节数
ls -l | awk 'BEGIN{size=0;} {size=size+$5;} END{print "[end]size is ",size}'
以M为单位显示:
ls -l | awk 'BEGIN{size=0;} {size=size+$5} END{print "size is ",size/1024/1024,"M"}'
18、统计某个文件夹下的文件占用的字节数,过滤4096大小的文件(一般都是文件夹)
ls -l | awk 'BEGIN{size=0;print "[start]size is ",size} {if($5!=4096){size=size+$5;}} END{print "[end]size is ",size/1024/1024,"M"}'
19、显示/etc/passwd的账户
awk -F':' 'BEGIN{count=0;} {name[count]=$1;count++} END{for(i=0;i<NR;i++) print i ,name[i]}' /etc/passwd
sed 命令
1、只查看文件的100行到200行
sed -n '100,200p' /etc/passwd
2、地址是逗号分隔的,那么需要处理的地址是这两行之间的范围(包括这两行在内)。范围可以用数字、正则表达式、或二者的组合表示。例如:
删除第二行到第五行: sed '2,5d' test.log
删除包含"My"的行到包含"You"的行之间的行: sed '/My/,/You/d' test.log
删除包含"My"的行到第十行之间的内容: sed '/My/,10d' test.log
3、打印匹配行
sed '/My/p' test.log
4、删除最后一行,其它的都会显示
sed '$d' test.log
5、删除包含My的行,其余的都被显示
sed '/My/d' test.log
6、替换
sed 's/My/You/g' test.log
7、取消默认输出,处理1到20行里匹配以My结尾的行,把行内所有的My替换为You,并打印到屏幕上
sed -n '1,20s/My$/You/gp' test.log
8、多重编辑(第一重编辑删除第1-3行。第二重编辑将出现的所有My替换为Your
sed -e '1,3d' -e 's/My/You/g' test.log
9、r命令
如果在文件datafile的某一行匹配到模式My,就在该行后读入文件introduce.txt的内容。如果出现My的行不止一行,则在出现My的各行后都读
入introduce.txt文件的内容:
sed 's/My/r introduce.txt' datafile
w命令
sed -n '/My/w me.txt' test.log
y命令(转换命令)
将1到20行内,所有的小写hrwang转换成大写,将1转换成^,将2转换成$。
sed '1,20y/hrwang/HRWANG^$'
喜欢就点个赞吧