Shell脚本三剑客——Grep(进阶版egrep)、Sed、Awk命令
Grep命令
1、基本正则表达式实例——查找特定字符这里我们就以存放本机所有用户的 Demo1 [[email?protected] ~]# grep -n "root" /etc/passwd //-n表示显示行号 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin 2、基本正则表达式实例——查找集合字符有重复的字符时,可使用“[ ]”来进行集合匹配,每次只匹配“[ ]”中的一个字符。 Demo2 [[email?protected] ~]# grep -n "[fn]tp" /etc/passwd 12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 27:ntp:x:38:38::/etc/ntp:/sbin/nologin 3、基本正则表达式实例——反向选择在“[ ]”中括号中添加“^”表示进行反向选择(有一定的基础的朋友肯定知道“^[ ]”表示定位行首,这里“^”内外位置意思将完全不同。) Demo3 [[email?protected] ~]# grep -n "^[^root]" /etc/passwd //匹配除了以root开头的所有选项 2:bin:x:1:1:bin:/bin:/sbin/nologin 3:daemon:x:2:2:daemon:/sbin:/sbin/nologin ...... 42:named:x:25:25:Named:/var/named:/sbin/nologin 4、基本正则表达式实例——转义符在正则表达式中一个元字符,所以在这里需要用转义字符“”将具有特殊意义的字符转化成普通字符。 Demo4 [[email?protected] ~]# grep -n ‘.$‘ test.txt 1:he was short and fat. 2:He was wearing a blue polo shirt with black pants. 3:The home of Football on BBC Sport online. 5:google is the best tools for search keyword. 5、基本正则表达式实例——查找任一字符&查找重复字符在正则表达式中小数点(.)也是一个元字符,代表任意一个字符。 Demo5-1 [[email?protected] ~]# grep -n "r..t" /etc/passwd //(.)小数点这里代表任一字符 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin 12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 在上述结果中,“root”字符串“r..t”匹配规则。若想要查询 oo、ooo、ooooo 等资料,则需要使用星号(*)元字符。但需要注意的是,“*”代表的是重复零个或多个前面的单字符。“o*”表示拥有零个(即为空字符)或大于等于一个“o”的字符 Demo5-2 [[email?protected] ~]# grep -n "oo*" /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 2:bin:x:1:1:bin:/bin:/sbin/nologin 3:daemon:x:2:2:daemon:/sbin:/sbin/nologin 4:adm:x:3:4:adm:/var/adm:/sbin/nologin 5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin ...... 6、基本正则表达式实例——查找连续字符范围例如,查找三到五个 o 的连续字符,这个时候就需要使用基础正则表达式中的限定范围的字符“{ }”。因为“{ }”在 Shell 中具有特殊 意义,所以在使用“{ }”字符时,需要利用转义字符“”,将“{ }”字符转换成普通字符。 Demo6 [[email?protected] ~]# grep -n "0{2,}" /etc/passwd //表示中间包含2以上o的字符串 11:games:x:12:100:games:/usr/games:/sbin/nologin 41:zhy:x:1000:1000:zhy:/home/zhy:/bin/bash Egrep命令此外,grep 命令仅支持基础正则表达式,如果使用扩展正则表达式,需要使用 egrep 或 awk 命令。awk 命令在后面的进行讲解,这里我们直接使用 egrep 命令。egrep 命令与 grep 命令的用法基本相似。(grep命令能用的egrep命令同样能够使用)
Demo演示 [[email?protected] ~]# egrep -n "10+" /etc/passwd //使用“+”扩展元字符 11:games:x:12:100:games:/usr/games:/sbin/nologin 31:qemu:x:107:107:qemu user:/:/sbin/nologin 41:zhy:x:1000:1000:zhy:/home/zhy:/bin/bash [[email?protected] ~]# egrep -n "10?" /etc/passwd //使用“?”扩展元字符 2:bin:x:1:1:bin:/bin:/sbin/nologin 9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10:operator:x:11:0:operator:/root:/sbin/nologin 11:games:x:12:100:games:/usr/games:/sbin/nologin [[email?protected] ~]# egrep -n ‘root|zhy‘ /etc/passwd //使用“|”扩展元字符 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin 41:zhy:x:1000:1000:zhy:/home/zhy:/bin/bash [[email?protected] ~]# egrep -n ‘(f|n)tp‘ /etc/passwd //使用“()”扩展元字符,可与“|”一起使用 12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 27:ntp:x:38:38::/etc/ntp:/sbin/nologin Sed命令sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作 sed 的工作流程主要包括读取、执行和显示三个过程。? 读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓 冲区中(又称模式空间,pattern space)。 ? 执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行。 ? 显示:发送修改后的内容到输出流。再发送数据后,模式空间将会被清空。 在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。 注意: 默认情况下,所有的sed命令都是在模式空间中进行,并不会进行保存。 Sed命令格式
常用选项
常用的“操作”参数
基本用法实例:输出所有,效果等同 [[email?protected] ~]# sed -n ‘p‘ /etc/passwd //效果等同cat命令 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin ...... 输出某一特定行,或者某一段行 [[email?protected] ~]# sed -n ‘10p‘ /etc/passwd //输出第10行内容 operator:x:11:0:operator:/root:/sbin/nologin [[email?protected] ~]# sed -n ‘2,4p‘ /etc/passwd //输出2~4行内容 bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin 输出所有奇数行 [[email?protected] ~]# sed -n ‘n;p‘ /etc/passwd //输出奇数行,偶数行为p;n bin:x:1:1:bin:/bin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync halt:x:7:0:halt:/sbin:/sbin/halt ...... 同样,除了基本的使用方法,sed命令也可以结合正则表达式进行使用输出包含特定内容的行(和grep命令一样,可以使用^、$来定位行首、行尾) [[email?protected] ~]# sed -n ‘/root/p‘ /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin 输出包含特定单词的行 [[email?protected] ~]# sed -n ‘/&;root&;/p‘ /etc/passwd //&; &;代表单词边界 root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin 替换符合条件的文本
将文本进行迁移
AWK命令AWK 是一种用于处理文本的编程语言工具。AWK 在很多方面类似于 shell 编程语言,尽管 AWK 具有完全属于其本身的语法,是任何环境中现有的功能最强大的数据处理引擎之一。 基本结构
基本使用实例[[email?protected] ~]# awk -F: ‘{print $1,$3}‘ /etc/passwd //以“:”作为分隔符,筛选出第一列和第三列的内容,并输出(默认情况下字段的分隔符为空格或者 tab 键) root 0 bin 1 daemon 2 adm 3 ...... 特殊的内建变量(可直接引入使用)
按行对文本进行输出 [[email?protected] ~]# awk ‘NR==2,NR==4{print}‘ /etc/passwd //输出第二行到第四行文本内容 bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin [[email?protected] ~]# awk -F ":" ‘NR==2,NR==4{print $1,$3}‘ /etc/passwd //输出第二行到第四行的第一列和第三列内容 bin 1 daemon 2 adm 3 [[email?protected] ~]# awk ‘(NR==1)||(NR==4){print}‘ /etc/passwd //输出第一行和第四行内容 root:x:0:0:root:/root:/bin/bash adm:x:3:4:adm:/var/adm:/sbin/nologin 输出奇、偶行(在awk中可以使用逻辑操作符“&&”,表示“与”, “||”表示“或”,“!”表示“非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别 表示加、减、乘、除、取余和乘方) [[email?protected] ~]# awk ‘NR%2==1{print}‘ /etc/passwd //输出奇数行 root:x:0:0:root:/root:/bin/bash daemon:x:2:2:daemon:/sbin:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown ...... [[email?protected] ~]# awk ‘NR%2==0{print}‘ /etc/passwd //输出偶数行 bin:x:1:1:bin:/bin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync halt:x:7:0:halt:/sbin:/sbin/halt ...... 输出以root开头的行 [[email?protected] ~]# awk ‘/^root/{print}‘ /etc/passwd root:x:0:0:root:/root:/bin/bash 统计以/bin/bash结尾的行数 [[email?protected] ~]# awk ‘BEGIN {x=0} ; //bin/bash$/{x++};END {print x}‘ /etc/passwd 2 统计以空行分隔的文本段落数: [[email?protected] opt]# vim name.txt zhangsan:lisi:wangwu zhaoliu:liuliu heiba:heihei [[email?protected] opt]# awk ‘BEGIN{RS=":"};END{print NR}‘ /opt/name.txt 5 //统计规则:遇到关键符号,折行 调用w 命令,并用来统计在线用户数: [[email?protected] opt]# awk ‘BEGIN {while ("w" | getline) n++;{print n-2}}‘ 1 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |