LINUX系统下的shell命令---grep、sed、awk
1、grep基本认识
(Global search regular expression and print out the line全局搜索研究正则表达时并显示出来)。grep命令是一种强大的文本搜索工具,根据用户指定模式,对目标文本进行匹配检查,打印匹配到的行。
2、语法: grep 匹配条件 处理的文件名
匹配条件可以是:搜索的字符串、数字等,也可以使用正表达式,通配符等等
处理的文件名可以是:目录/文件 或 .
3.参数:
4、grep中字符的匹配次数设定
* 字符出现0到n次
? 字符出现0或1次
+ 字符出现1到n次
{4} 字符出现4次
{1,5} 字符出现次数,最少1次,最多5次
{m,} 字符出现次数最少m次
(xy){4} 字符xy出现次数为4次
5.示例:
- grep root pass ##查看pass文件中含有root字符的结果
- grep ^root pass ##查看开头为root的结果
- grep root$ pass ##显示以root结尾的行的结果
- grep -i root pass ##显示的时候,忽略大小写
- grep -E "root|ROOT" pass ##显示为root或者ROOT的结果(注意。使用-E时,是有两个条件)
- grep root pass | grep -E "^root|root$" -v ##在root行中,显示除了开头和结尾是root的。(-v表示反向选择)
- grep -E '\<...r' pass ##显示以r结尾(但r不是最后一个字符)且前面是三个字母的(\<表示r前面只能有三个字符)
- grep -E "\<...t\>" pass ##高亮显示的字母一定是4个,且最后一个是t
- grep ....t pass ##显示结果如下:
- grep -E "\<[[:alpha:]]{3}\>|[[:digit:]]{1,}" xniu ##显示含有三个小写字母或者含数字的行
- grep -E 'xa*y' test ##有结果可知,*表示xy中见a的个数为0到n
- grep -E 'xa?y' test ##由结果可只,?表示a的个数为0或1个
- 用 + 表示a的个数为1到n;{4}表示a的个数只能为4个
2)sed行编辑器
1、 sed相关介绍:
(stream editor)是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作。用来操作纯ASCLL码的文本。处理时,把当前的行存储在临时缓冲区中,称为模式空间(pattern space),可以指定仅仅处理哪些行;处理完成时,把缓冲区的内容送到屏幕;接着下一行的处理。
2、语法:sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
3、常用参数
-n∶使用安静(silent)模式。在一般情况下,所有来自 STDIN的资料一般都会被列出到屏幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e∶直接在指令列模式上进行 sed 的动作编辑;
-f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
-r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i∶直接修改读取的档案内容,而不是由萤幕输出。
4、常用模式:
p 显示模式
-d 删除模式
a 向下插入模式
i 向上插入模式
c 替换模式
w 写入文件模式
r 插入文件模式
= 添加行号
5、操作示例:
- 分别显示fstab文件中4到6行、第四和六行、第六行的内容
- 显示除了第6行的所有行 (在进行取操作时,在p前面添加)
- sed -n '/^#/p' fstab ##显示以#开头的内容 (其中//中添加关键字);-n 表示只显示最终结果;若没有n时,fatab中的内容会显示出来
- cat -n fstab | sed '5,7d' 删除5到7行
- cat -n fstab | sed -e '5d;7d' 删除第五和第七行
- sed '/^#/d' fstab ##删除#开头的所有行
- sed '/UUID/aword\nhello' file ##在file文件UUID的下一行添加word;再下一行中添加hello
- sed '/UUID/ixniu' fstab ##在文件的UUID前面插入xniu
- sed -n '/^#/wxniu' fstab ##以#开头的行写入文件xniu中,-n不显示fstab的内容
- sed 's/\<bin/hello/g' pass ##把所有行和列中中以bin开头的修改为/hello
- sed 's@\/@%%@g' pass ##此时的@与/功能类似
- sed '=' pass | sed 'N;s/\n/ /g' ##修改\n为空;意思去掉空格。N表示可以时\n生效;=添加行号
- sed -f rule pass ##在rule文件中写入要执行的变化
- sed -n '/^#/=' fstab ##只显示行号,无内容
- sed '/^#/=' fstab ## 显示#开头的行号和对应内容
- sed '$r user' fstab ##把文件user中的内容加入fstab的最后一行
- sed '1r user' fstab ##把user中的内容加入第一行
- sed '/UUID/r user' fstab ##加在UUID所在行的下一行
- sed '/hello/cniu' -i aa ##-i修改时,同时修改文件中的内容
- sed 'G' pass ##使文件data中的每行都隔开一行显示
- sed '$!G' pass ##文件的最后一行没有间隔
- sed -n '$p' pass ##显示最后一行的内容
- sed '/root/,/mail/s/nologin/##/g;s/sbin/westos/g' pass ##查看固定区域内的且修改sbin为westos
3)awk报告生成器
1、awk基本介绍
awk处理机制:awk会逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行做一些总结性质的工作。在命令格式上分别体现如下:
BEGIN{}:读入第一行文本之前执行,一般用来做初始化操作
{}:逐行处理,逐行读入文本并执行响相应的处理。
END{}:处理完最后一行文本之后执行,一般用来输出处理结果
2、基本用法
awk '{print filename}' passwd
awk '{print “NR”行,"NF"列}'
awk 'BEGIN{print NAME}'
awk 'END{print xniu}'
awk -F : 'BEGIN{print name}{print $1}END{XNIU}'
awk '/bash$/'
awk -F : '/bash$/{print $1}'
3、示例
- awk -F : '{print $1}' pass ##分割符为:,输出第一列的内容
- awk -F : '{print $1","$2}' pass ##在输出第一列和第二列时,添加符号时用“”
- awk -F : 'BEGIN{print "name"}{print $1}END{print "end"}' pass ##在输出第一列的时候,刚开始输出name,结束后输出end
- awk -F : 'END{print NR","NF}' pass ##输出pass文件的行和列
- awk 'BEGIN{N=0}{N++}END{print N}' pass ##使用算法的自增计算行数
- awk -F : '/bash$/{print $1}' /etc/passwd ##以:分隔符,输出以bash结尾的第一列
- awk -F : '/bash$/||/sh$/{print $1}' /etc/passwd ##使用||符号可以设置两个并列条件
- cat -n pass | awk 'NR>=4&&NR<=6{print}' ##显示第四行到第6行的内容
- awk -F : '/^ro/{print}' /etc/passwd ##显示以ro开头行的内容
- awk -F : '/^[a-d]/{print $1","$6}' /etc/passwd ##显示以a-d任意字符开头第一列和第六列
- awk -F : '/^a|nologin$/{print $1$7}' pass ##显示以a开头或以nologin结尾的行内容的第一和七列
- awk -F : '$6~/bin$/{print $1" "$6}' pass ## 若第6列以bin结尾,则输出该行的第一列和第6列
- awk -F : '$6!~/bin$/{print $1" "$6}' pass ##输出第六列不以bin结尾的行的第1、6列
例题一: 显示本机的IP
ifconfig eth0 | awk '/\<inet/{print $2}' 或者 ifconfig eth0|sed -n 2p | awk -F " " '{print $2}' 或 awk -F = '/^IPADDR0/{print $2}' /etc/sysconfig/network-scripts/ifcfg-eth0
例题二:查找以可以登陆系统的用户(bash类型),并且用户在home目录下
awk -F : '/bash$/&&$6~/^\/home/{print $1}' /etc/passwd
例题三:使用一条命令执行,找出/usr/share/mime/packages/freedesktop.org.xml文件中含有ICH的行,并去掉空格后存入/root/lines文件中。
sed 's/^ *//g;/ich/w/root.lines' /usr/share/mime/packages/freedesktop.org.xml
例题四:输出不含数字或特殊字符的test
awk '!/^[[:digit:][:punct:]]/{print}' test