zoukankan      html  css  js  c++  java
  • 史上最详细的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 "		uid:" $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"	"$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
    ",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^$'
    
    喜欢就点个赞吧
  • 相关阅读:
    jquery 的ready() 与window.onload()的区别
    使IE6同样支持圆角效果
    菜鸟级三层框架(EF+MVC)项目实战之 系列一 EF零基础创建领域模型
    asp.net webform 与mvc 共享session
    用户密码安全存储解决方案
    vs2010 web负载测试解决提示:结果存储类型为“Database”,但尚未指定结果储存库连接字符串。
    菜鸟级三层框架(EF+MVC)项目实战之 系列二 对数据访问层的抽象中
    菜鸟级三层框架(EF+MVC)项目实战之 系列四 UI层ASP.NET MVC实现CRUD
    菜鸟级三层框架(EF+MVC)项目实战之 系列二 对数据访问层的抽象下
    WP7之文件传送利器(web service)
  • 原文地址:https://www.cnblogs.com/wangjingguan/p/12902778.html
Copyright © 2011-2022 走看看