第十一节课正则介绍、grep、sed、awk

一、正则介绍_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, p p a s s w d . b a k 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 1 , 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 ‘:’ ‘ 3==0 {print 1}’ 1.txt //匹配第3段等于0的,并打印第1段;

awk -F ‘:’ ‘$3>=1000’ 1.txt //匹配第3段大于等于1000的,并打印所有段
这里写图片描述
awk -F ‘:’ ‘$3>=”1000”’ 1.txt,“1000”是以ASC码值进行排序的,被认为是字符串

awk -F ‘:’ ‘ 7!="/sbin/nologin" {print 0}’ 1.txt ,匹配出第7段不是/sbin/nologin的所有段,!=表示不匹配
这里写图片描述

条件操作符

awk -F ‘:’ ‘ 3 < 4’ 1.txt ,匹配比较第3段小于第4段的行;awk -F ‘:’ ‘ 3 == 4’ 1.txt,匹配出第3段和第4段相等的行,==就是等于,精确匹配
这里写图片描述
awk -F ‘:’ ‘ 3>"5" && 3<”7”’ 1.txt ,匹配第3段大于5的,和小于7的行,&&表示并且的意思
这里写图片描述
awk -F ‘:’ ‘ 3 > 1000 | | 7==”/sbin/nologin”’ 1.txt ,匹配第3段大于1000的,或者第7段等于/sbin/nologin的所在的行,|| 表示 或者 的意思
这里写图片描述
awk -F ‘:’ ‘ 3 > 1000 | | 7 ~ /bash/’ 1.txt,匹配第3段大于1000的,或者第7段包含/bash/的
这里写图片描述

awk的内置变量

常用的变量有OFS、NF和NR,OFS与-F选项有类似的功能,用来定义分隔符,但是在输出时定义

awk -F ‘:’ ‘{OFS=”#”} {if ( 3>1000) {print 1, 3 , 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 N R ":" 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

猜你喜欢

转载自blog.csdn.net/iamfishhh/article/details/80570399