一、正则介绍_grep
正则介绍
正则就是一串有规律的字符串
掌握好正则对编写shell脚本有很大帮助
各种编程语言中都有正则,原理是一样的
常用的工具有grep/egrep、sed、awk
二、grep
. 表示任意一个任意字符
- 表示零个或多个*前面的字符
.* 表示通配,所有的都匹配
{} 表示范围,{}花括号前面字符的一个范围
+表示一个或多个+号前面的字符
?表示0个或一个问号前面的字符
|表示或者
过滤指定的关键词,格式为:grep [-cinvABC] ‘关键词’ filename
[root@aming01 ~]# grep 'nologin' passwd.bak
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
-c:表示打印符合要求的行数
[root@aming01 ~]# grep -c 'nologin' passwd.bak
14
-n:表示输出符合要求的行及行号
[root@aming01 ~]# grep -n 'nologin' passwd.bak
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
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
-i:不区分大小写
[root@aming01 ~]# grep -niv 'nologin' passwd.bak
1:root:x:0:0:root:/root:/bin/bash
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
19:hhh:x:1001:1005::/home/qwe:/bin/bash
20:user1:x:1002:1002::/home/user1:/bin/bash
21:su1:x:1003:1003::/home/su1:/bin/bash
-r:遍历所有子目录
[root@aming01 ~]# grep -r 'root' /etc/
/etc/grub.d/00_header:datarootdir="/usr/share"
/etc/grub.d/00_header:export TEXTDOMAINDIR="${datarootdir}/locale"
/etc/grub.d/00_header:if loadfont `make_system_path_relative_to_its_root "${GRUB_FONT}"` ; then
/etc/grub.d/00_header: font="`make_system_path_relative_to_its_root "${font_path}"`"
/etc/grub.d/00_header:loadfont (\$root)`make_system_path_relative_to_its_root $x`
/etc/grub.d/00_header:set theme=(\$root)`make_system_path_relative_to_its_root $GRUB_THEME`
-A :后面跟一个数字,过滤出符合要求的行以及下面n行
[root@aming01 ~]# grep -A2 'root' passwd.bak
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
-B:后面跟一个数字,过滤出符合要求的行以及上面n行
[root@aming01 ~]# grep -nB2 'root' passwd.bak
1:root:x:0:0:root:/root:/bin/bash
--
8-halt:x:7:0:halt:/sbin:/sbin/halt
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
-C:后面跟一个数字,过滤出符合要求的行以及上下各n行
[root@aming01 ~]# grep -nC2 'root' passwd.bak
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
--
8-halt:x:7:0:halt:/sbin:/sbin/halt
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
12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
grep ‘[0-9]’:表示过滤出包含数字的所有行
[root@aming01 ~]# grep '[0-9]' passwd.bak
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
grep -nv ‘[0-9]’:表示过滤出不包含数字的所有行(实例有没不包含数字的行)
[root@aming01 ~]# grep -nv '[0-9]' passwd.bak
[root@aming01 ~]#
grep -v ‘^#’:表示过滤掉所有已#开头的行,^表示以什么开头
[root@aming01 ~]# grep -n '^#' passwd.bak
22:#123
grep ‘[^0-9]’:表示过滤掉所有数字,^在中括号里表示非的意思
[root@aming01 ~]# grep -n [^0-9] passwd.bak
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
grep -n ‘^[^0-9]’:表示过滤出以非数字开头的行和行号
[root@aming01 ~]# grep -n '^[^0-9'] passwd.bak
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:sync:x:5:0:sync:/sbin:/bin/sync
grep -nv ‘^[^0-9]’:表示过滤出以数字开头的行和行号
[root@aming01 ~]# echo "123">> passwd.bak
[root@aming01 ~]# grep -nv '^[^0-9]' passwd.bak
23:123
grep ‘r.o’:表示过滤出任意的一个字符, . 表示任意一个字符
[root@aming01 ~]# grep 'r.o' passwd.bak
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
grep ‘o*o’:表示过滤出零个到多个o(*前面的字符)
[root@aming01 ~]# grep 'r.o' passwd.bak
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@aming01 ~]# grep 'o*o' passwd.bak
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
grep ‘.*’:表示过滤出任意字符
[root@aming01 ~]# grep '.*' passwd.bak
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
grep ‘o\ {2\ }’ :表示过滤出指定字符出现的次数,{}可以是一个范围,如’o\ {0,3\ }’
[root@aming01 ~]# grep 'o\{2\}' passwd.bak
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
还有两种表示方法:egrep ‘o{2 }’ grep -E ‘o {2 }’
[root@aming01 ~]# egrep '0{2}' passwd.bak
games:x:12:100:games:/usr/games:/sbin/nologin
hhh:x:1001:1005::/home/qwe:/bin/bash
user1:x:1002:1002::/home/user1:/bin/bash
su1:x:1003:1003::/home/su1:/bin/bash
[root@aming01 ~]# grep -E '0{2}' passwd.bak
games:x:12:100:games:/usr/games:/sbin/nologin
hhh:x:1001:1005::/home/qwe:/bin/bash
user1:x:1002:1002::/home/user1:/bin/bash
su1:x:1003:1003::/home/su1:/bin/bash
grep ‘o+o’:表示过滤出1个到多个o(+前面的字符)
[root@aming01 ~]# grep 'o\{2\}' passwd.bak
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
[root@aming01 ~]# egrep '0{2}' passwd.bak
games:x:12:100:games:/usr/games:/sbin/nologin
? :问号表示问号左边的字符只能出现0次或1次,需要使用转义符或egrep 或加-E选项
[root@aming01 ~]# egrep "a?bash" passwd.bak
root:x:0:0:root:/root:/bin/bash
hhh:x:1001:1005::/home/qwe:/bin/bash
user1:x:1002:1002::/home/user1:/bin/bash
su1:x:1003:1003::/home/su1:/bin/bash
grep -E ‘root|nologin’ ,|表示或者的意思
[root@aming01 ~]# grep -E 'root|nologin' passwd.bak
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
把一个目录下,过滤所有.txt文档中含有aa222的行; grep -r –include=”.txt” ‘aa222’ /
三、sed
sed与grep比较,sed能实现grep功能,但是比较麻烦,而且没有颜色显示;sed优势在于替换一些指定的字符。
用sed实现grep匹配的功能,匹配关键词用//,-n作用是只显示我们要打印的行,没加-n会输出所有内容,并且输出两次查找到的内容。
[root@aming01 ~]# sed -n '/root/'p passwd.bak
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
sed还支持. * + 等特殊符号
[root@aming01 ~]# sed -n '/r.t/'p passwd.bak
operator:x:11:0:operator:/root:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@aming01 ~]# sed -n '/r*t/'p passwd.bak
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@aming01 ~]# sed -nr '/o+t/'p passwd.bak
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
sed -nr ‘/o{2}/’p passwd.bak,匹配两次o
[root@aming01 ~]# sed -nr '/o{2}/'p passwd.bak
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sed -nr ‘/root|sbin/’p passwd.bak,匹配或者的用法
[root@aming01 ~]# sed -nr '/root|sbin/'p passwd.bak
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
sed -n ‘1’p passwd.bak ,打印指定的行; sed -n ‘1,3’p passwd.bak,打印1-3行;sed -n ‘20, 表示末行
[root@aming01 ~]# sed -n '1'p passwd.bak
root:x:0:0:root:/root:/bin/bash
[root@aming01 ~]# sed -n '1,3'p passwd.bak
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@aming01 ~]# sed -n '20,$'p passwd.bak
user1:x:1002:1002::/home/user1:/bin/bash
su1:x:1003:1003::/home/su1:/bin/bash
#123
123
sed -n ‘1,$’p passwd.bak,全部打印出来
sed -e用法,在一行里执行多条命令
sed -e ‘1’p -e ‘/root/’p -n passwd.bak,先打印第一行,然后再匹配含有root的行
[root@aming01 ~]# sed -e '1,3'p -e '/root/'p -n passwd.bak
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
sed -e ‘1’p -e ‘/root/’p -e ‘/oo*/’p -n passwd.bak ,执行多条命令
sed -n ‘/bus/’Ip passwd.bak,匹配不区分大小写
sed删除指定的行
sed ‘1,20’d passwd.bak,删除打印出来的1-20行,实际上并没有删掉文件内容
[root@aming01 ~]# sed '1,20'd passwd.bak
su1:x:1003:1003::/home/su1:/bin/bash
#123
123
[root@aming01 ~]# wc -l passwd.bak
23 passwd.bak
加上-i,可以直接删除文件内容
sed查找替换,与vim类似;sed ‘1,10s/root/toor/g’ passwd.bak,s表示替换关键词,g表示全局替换
[root@aming01 ~]# sed '1,10s/root/toor/g' passwd.bak |head
toor:x:0:0:toor:/toor:/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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/toor:/sbin/nologin
sed -r ‘1,10s/ro+/r/g’ passwd.bak,替换的字符串能识别正则表达式
[root@aming01 ~]# sed -r '1,10s/ro+/r/g' passwd.bak
rt:x:0:0:rt:/rt:/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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/rt:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
sed -r ‘s/([^:]+):(.*):([^:]+)/\3:\2:\1/’ passwd.bak |head,替换每行第一段和最后一段字符串的位置,以冒号为参考对象,小括号里的内容用\1、\2、\3表示
[root@aming01 ~]# sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' passwd.bak |head
/bin/bash:x:0:0:root:/root:root
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon
/sbin/nologin:x:3:4:adm:/var/adm:adm
/sbin/nologin:x:4:7:lp:/var/spool/lpd:lp
/bin/sync:x:5:0:sync:/sbin:sync
/sbin/shutdown:x:6:0:shutdown:/sbin:shutdown
/sbin/halt:x:7:0:halt:/sbin:halt
/sbin/nologin:x:8:12:mail:/var/spool/mail:mail
/sbin/nologin:x:11:0:operator:/root:operator
sed ‘s/\/root/123/g’ passwd.bak |head,将/root替换成123,要用脱义符号\
[root@aming01 ~]# sed 's/\/root/123/g' passwd.bak |head
root:x:0:0:root:123:/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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:123:/sbin/nologin
[root@aming01 ~]# sed -r 's/\/sbin\/nologin/123/g' passwd.bak |head
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:123
daemon:x:2:2:daemon:/sbin:123
adm:x:3:4:adm:/var/adm:123
lp:x:4:7:lp:/var/spool/lpd:123
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:123
operator:x:11:0:operator:/root:123
或者把分隔符/换成#和@来区分
[root@aming01 ~]# sed 's#/sbin/nologin#123#g' passwd.bak |head
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:123
daemon:x:2:2:daemon:/sbin:123
adm:x:3:4:adm:/var/adm:123
lp:x:4:7:lp:/var/spool/lpd:123
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:123
operator:x:11:0:operator:/root:123
sed ‘s/[a-zA-Z]//g’删除文件中所有英文字母
[root@aming01 ~]# sed 's/[a-zA-Z]//g' passwd.bak |head
::0:0::/://
::1:1::/://
::2:2::/://
::3:4:://://
::4:7::///://
::5:0::/://
::6:0::/://
::7:0::/://
::8:12::///://
::11:0::/://
sed -r ‘s/(.*)/aaa:&/’ ,在所有行前面加上固定字符串,&表示前面小括号内的内容
[root@aming01 ~]# sed -r 's/(.*)/aaa:&/' passwd.bak |head
aaa:root:x:0:0:root:/root:/bin/bash
aaa:bin:x:1:1:bin:/bin:/sbin/nologin
aaa:daemon:x:2:2:daemon:/sbin:/sbin/nologin
aaa:adm:x:3:4:adm:/var/adm:/sbin/nologin
aaa:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
aaa:sync:x:5:0:sync:/sbin:/bin/sync
aaa:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
aaa:halt:x:7:0:halt:/sbin:/sbin/halt
aaa:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
aaa:operator:x:11:0:operator:/root:/sbin/nologin
四、awk
awk
awk兼具sed的所有功能,而且还支持分段
截取文档中某个段
打印文档中的某段,-F作用是指定分隔符
打印所有的段awk -F ‘:’ ‘{print $0}’ 1.txt
打印文件的全部内容awk ‘{print $0}’ 1.txt,不需要加F,类似于cat查看文件
awk如果不指定分隔符,则默认空格或空白为分隔符
打印多段内容awk -F ‘:’ ‘{print
2,$4}’ 1.txt
打印内容可以指定#来分割,需要用到双引号
awk匹配功能
awk ‘/oo/’ 1.txt ,匹配包含oo的行
awk -F ‘:’ ‘$1 ~ /oo/’ 1.txt ,打印第一段中包含oo的行,~表示匹配
awk -F ‘:’ ‘$1 ~ /o+/’ test.txt ,匹配第一段中包含o的行,支持正则表达式;这里需要知道,出现特殊符号时,awk不用加脱义字符,grep和sed则必须要加脱义字符
awk支持多个表达式一起写
针对数学表达式的用法
awk -F ‘:’ ‘$3==0’ 1.txt ,匹配第3段等于0的;
awk -F ‘:’ ‘ 1}’ 1.txt //匹配第3段等于0的,并打印第1段;
awk -F ‘:’ ‘$3>=1000’ 1.txt //匹配第3段大于等于1000的,并打印所有段
awk -F ‘:’ ‘$3>=”1000”’ 1.txt,“1000”是以ASC码值进行排序的,被认为是字符串
awk -F ‘:’ ‘
0}’ 1.txt ,匹配出第7段不是/sbin/nologin的所有段,!=表示不匹配
条件操作符
awk -F ‘:’ ‘
4’ 1.txt ,匹配比较第3段小于第4段的行;awk -F ‘:’ ‘
4’ 1.txt,匹配出第3段和第4段相等的行,==就是等于,精确匹配
awk -F ‘:’ ‘
3<”7”’ 1.txt ,匹配第3段大于5的,和小于7的行,&&表示并且的意思
awk -F ‘:’ ‘
7==”/sbin/nologin”’ 1.txt ,匹配第3段大于1000的,或者第7段等于/sbin/nologin的所在的行,|| 表示 或者 的意思
awk -F ‘:’ ‘
7 ~ /bash/’ 1.txt,匹配第3段大于1000的,或者第7段包含/bash/的
awk的内置变量
常用的变量有OFS、NF和NR,OFS与-F选项有类似的功能,用来定义分隔符,但是在输出时定义
awk -F ‘:’ ‘{OFS=”#”} {if (
1,
7}}’ 1.txt //匹配第3段大于1000,第7段匹配/bash/的,然后打印第1,第3,第7段内容, 并用#分割
NF表示用分隔符分割后一共有多少行;NR表示行号
awk -F ‘:’ ‘NR<=10’ 1.txt ,打印前10行;awk -F ‘:’ ‘NR<=10 && $1 ~ /root|sync’ 1.txt,匹配前10行中,第1段包含root或者sync的
awk -F ‘:’ ‘NF==6 && $1 ~ /root|sync/’ 1.txt,匹配文件中是6段的,并在第1段包含root或者sync的
awk -F ‘:’ ‘{print
NF}’ 1.txt
head -n3 1.txt |awk -F ‘:’ ‘$1=”root”’ ,在前3行中,给第1段赋值为root
awk -F ‘:’ ‘{(tot=tot+$3)}; END {print tot}’ 1.txt,tot值求和,tot默认0开始,每次和新的第三段值相加,最终第三段值加完,输出tot值
扩展:
把一个目录下,过滤所有*.php文档中含有eval的行
grep -r –include=”*.php” ‘eval’ /data/
把这里面的所有练习题做一下
http://www.apelearn.com/study_v2/chapter14.html
第十二课复习(以下扩展内容要学习一下)
打印某行到某行之间的内容http://ask.apelearn.com/question/559
sed转换大小写 http://ask.apelearn.com/question/7758
sed在某一行最后添加一个数字http://ask.apelearn.com/question/288
删除某行到最后一行 http://ask.apelearn.com/question/213
打印1到100行含某个字符串的行 http://ask.apelearn.com/question/1048
awk 中使用外部shell变量http://ask.apelearn.com/question/199
awk 合并一个文件 http://ask.apelearn.com/question/493
把一个文件多行连接成一行 http://ask.apelearn.com/question/266
awk中gsub函数的使用 http://ask.apelearn.com/question/200
awk 截取指定多个域为一行 http://ask.apelearn.com/question/224
过滤两个或多个关键词 http://ask.apelearn.com/question/198
用awk生成以下结构文件 http://ask.apelearn.com/question/5494
awk用print打印单引号 http://ask.apelearn.com/question/1738
合并两个文件 http://ask.apelearn.com/question/945
awk的BEGIN和END http://blog.51cto.com/151wqooo/1309851
awk的参考教程 http://www.cnblogs.com/emanlee/p/3327576.html