史上最详细的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,没有出现rootnologig的行取出来

    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
  • 搜索testtast字符串

    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)

  • 打印所有包含NWEA的行

    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^$'
posted @ 2020-05-16 23:14  我不是教主  阅读(304)  评论(0编辑  收藏  举报