正则表达式笔记

正则表达式:它是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。对于系统管理员来讲,正则表达式贯穿在我们的日常运维工作中,无论是查找某个文档,抑或查询某个日志文件分析其内容,都会用到正则表达式。

其实正则表达式,只是一种思想,一种表示方法。只要我们使用的工具支持表示这种思想那么这个工具就可以处理正则表达式的字符串。常用的工具有grep, sed, awk 等

一、grep和egrep工具的使用

1、grep命令用于查找文件里符合条件的字符串,格式:grep [选项] '关键字符' filename

选项  
-c :打印符合要求的行数
-i :忽略大小写
-n :在输出符合要求的行的同时连同行号一起输出
-v :打印不符合要求的行
-r :遍历所有子目录甚至孙目录
-A :后跟一个数字(有无空格都可以),例如 –A2则表示打印符合要求的行以及下面两行
-B :后跟一个数字,例如 –B2 则表示打印符合要求的行以及上面两行
-C :后跟一个数字,例如 –C2 则表示打印符合要求的行以及上下各两行 

实际操作

[root@localhost ~]# mkdir grep (创建grep目录)
[root@localhost ~]# cd grep
[root@localhost grep]# mv /etc/passwd .  (将/etc/passwd拷贝到该目录下,用作样本文件)
[root@localhost grep]# ls
passwd
[root@localhost grep]# grep 'nologin' passwd  (过滤含有'nologin'字符的文件,并会显示成红色)
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
......(中间省略)
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
[root@localhost grep]# which grep
alias grep='grep --color=auto'
/usr/bin/grep
[root@localhost grep]# grep -c 'nologin' passwd (显示有多少行)
15
[root@localhost grep]# grep -n 'nologin' passwd  (显示行号)
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
......(中间省略)
18:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
19:chrony:x:998:996::/var/lib/chrony:/sbin/nologin
[root@localhost grep]# grep -niv 'nologin' passwd
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
20:mxk:x:1000:1000::/home/mxk:/bin/bash
[root@localhost grep]# grep 'root' /etc (加-r会将该目录下所有含有'root'的文件列出来,不加会报错)
grep: /etc: 是一个目录
[root@localhost grep]# grep 'root' /etc/passwd- 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost grep]# grep -r 'root' /etc > /tmp/grep.log  (将过滤含有root的问价追加到/tmp/grep.log文件去)
[root@localhost grep]# grep passwd /tmp/grep.log (可以查看到内容)
/etc/passwd-:root:x:0:0:root:/root:/bin/bash
/etc/passwd-:operator:x:11:0:operator:/root:/sbin/nologin
/etc/postfix/main.cf:# the system passwd file in the chroot jail is just not practical.
[root@localhost grep]# grep -A2 'halt' /etc/passwd  (把包含 ‘halt’ 的行以及这行下面的两行都打印出)
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
[root@localhost grep]# grep -B2 'halt' /etc/passwd  (把包含 ‘halt’ 的行以及这行上面的两行都打印出)
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
[root@localhost grep]# grep -C2 'halt' /etc/passwd  (把包含 ‘halt’ 的行以及这行上面和下面的各两行都打印出)
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
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin 

相关正则表达式的使用(1)

[root@localhost grep]# grep -n '[0-9]' passwd (显示含有0-9任何数字的行)
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/nologin
......(中间省略)
19:chrony:x:998:996::/var/lib/chrony:/sbin/nologin
20:mxk:x:1000:1000::/home/mxk:/bin/bash
[root@localhost grep]# grep -v '[0-9]' passwd  (显示不含数字的行,表示该文件每一行都含有数字)
[root@localhost grep]#
“^字符”表示以什么字符开头的行
[root@localhost grep]# grep -n '^#' inittab  (过滤显示以#开头的所有行)
1:# inittab is no longer used when using systemd.
2:#
3:# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
5:#
6:# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
7:#
8:# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
9:#
10:# multi-user.target: analogous to runlevel 3
11:# graphical.target: analogous to runlevel 5
12:#
14:# To view current default target, run:
15:# systemctl get-default
16:#
17:# To set a default target, run:
18:# systemctl set-default TARGET.target
19:#
[root@localhost grep]# grep -nv '^#' inittab  (过滤显示不以#开头的所有行)
4:hfdahfdghafgah
13:fadsjfahfaj
[root@localhost grep]# grep -n '[^0-9]' inittab (过滤显示包含数字的,其中数字不显示颜色,其他字符显示红色)
[root@localhost grep]# grep -n '^[^0-9]' inittab  (显示不以数字开头的行)
1:# inittab is no longer used when using systemd.
2:#
3:# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
4:hfdahfdghafgah
5:#
6:# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
7:#
8:&#$%^&&
9:# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
10:#
12:# multi-user.target: analogous to runlevel 3
13:# graphical.target: analogous to runlevel 5
14:#
15:fadsjfahfaj
16:# To view current default target, run:
17:# systemctl get-default
18:aaaaaaaa
19:#
20:# To set a default target, run:
21:# systemctl set-default TARGET.target
22:#
[root@localhost grep]# grep -nv '^[^0-9]' inittab  (显示以数字开头数字的行)
11:11111111

相关正则表达式的使用(2)

[root@localhost grep]# grep 'r.o' passwd   (. 表示任意的一个字符,并且会显示红色)
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost grep]# vim passwd 
[root@localhost grep]# grep 'r.o' passwd   (可以匹配到任何字符)
root:x:0:0:root:/root:/bin/bash
ajhfuvbufab:133222:fafer4:gfdsfee:rao:222
222:r>o:fajhfug
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost grep]# grep 'r.o' passwd   (也可以匹配到与之相同的 . )
root:x:0:0:root:/root:/bin/bash
ajhfuvbufab:133222:fafer4:gfdsfee:rao:222
222:r>o:fajhfug
333:r.o:fasdf
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost grep]# grep 'o*o' passwd   ( *表示零个或多个任意字符,而.*就包含了零个或多个任意字符,空行也包含在内)
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
ajhfuvbufab:133222:fafer4:gfdsfee:rao:222
.....(中间省略)
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
mxk:x:1000:1000::/home/mxk:/bin/bash
[root@localhost grep]# grep 'o\{2\}' passwd  (过滤显示字符的出现次数,现在显示的是o出现两次以上的文件)
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  

grep -E 'o{2}' passwd和grep 'o\{2\}' passwd表示同样的意思

{ },其内部为数字,表示前面的字符要重复的次数。上例中表示包含有两个o 即 ‘oo’ 的行。注意,{ }左右都需要加上脱意字符 ‘\’, 另外,使用{ }我们还可以表示一个范围的,具体格式是 ‘{n1,n2}’ 其中n1<n2,表示重复n1到n2次前面的字符,n2还可以为空,则表示大于等于n1次

2、egrep的用法

1)egrep的grep扩展版本,可以用egrep完成grep不能完成的工作

[root@localhost grep]# egrep 'o{2}' passwd  (egrep在执行此命令时不需要加脱意字符 ‘\’)
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@localhost grep]# egrep 'o+o' passwd  (筛选+前面一个或一个以上的字符)
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@localhost grep]# egrep 'o+t' passwd 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost grep]# egrep 'o?t' passwd  (筛选?前面零个或一个指定的字符)
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
......(中间省略)
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@localhost grep]# egrep 'root|halt' passwd   (| 表示或者的意思,显示红色)
root:x:0:0:root:/root:/bin/bash
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin    

二、sed介绍

sed工具以及awk工具能实现把替换的文本输出到屏幕上的功能,sed和awk都是流式编辑器,是针对文档的行来操作的。

1、sed命令格式:sed -n 'n'p 文件名

选项
-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
-h或--help 显示帮助。
-n或--quiet或--silent 仅显示script处理后的结果。
-V或--version 显示版本信息。
动作说明:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法

具体操作(1)打印功能

[root@localhost sed]# sed -n  '/root/'p test.txt   (sed有匹配的功能)
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost sed]# sed -n  '/r.t/'p test.txt 
operator:x:11:0:operator:/root:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@localhost sed]# sed -n  '/r+t/'p test.txt 
[root@localhost sed]# sed -nr  '/o+t/'p test.txt   (加-r就不需要脱义符)
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost sed]# sed -n  '/o+t/'p test.txt   (如果不加脱义符和-r就不会显示)
[root@localhost sed]# sed -n  '/o\+t/'p test.txt 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost sed]# sed -n '2'p test.txt   (指定打印第几行,''里边的就是需要打印的)
bin:x:1:1:bin:/bin:/sbin/nologin
[root@localhost sed]# sed -n '2,5'p test.txt  (需要打印的也可以是一个范围)
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
[root@localhost sed]# sed -n '14,$'p test.txt  (打印从14行开始到末尾,$表示末尾)
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
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
mxk:x:1000:1000::/home/mxk:/bin/bash
[root@localhost sed]# sed -n '1,$'p test.txt  (表示打印全部,从1到$)
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
......(中间省略)
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
mxk:x:1000:1000::/home/mxk:/bin/bash
[root@localhost sed]# sed -e '1'p -e '/bus/'p -n test.txt   (可以多个表达式共同使用,第一个表示打印第一行,第二个表示打印有bus字符串的)
root:x:0:0:root:/root:/bin/bash
dbus:x:81:81:System message bus:/:/sbin/nologin
[root@localhost sed]# sed -e '1'p -e '/root/'p -n test.txt  (两个表达式不互相干扰,第一个打印完,第二个还会继续打印一次)
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost sed]# sed -e '1'p -e '/bus/'p -e '/mxk/'p -n test.txt  (还可以继续添加表达式) 
root:x:0:0:root:/root:/bin/bash
dbus:x:81:81:System message bus:/:/sbin/nologin
mxk:x:1000:1000::/home/mxk:/bin/bash
[root@localhost sed]# sed -e '/bus/'p -n test.txt 
dbus:x:81:81:System message bus:/:/sbin/nologin
[root@localhost sed]# vi test.txt 
[root@localhost sed]# sed -e '/bus/'Ip -n test.txt  (大写的I可以不区分大小写) 
sync:x:5:0:sync:/sbin:/bin/syncBus
dbus:x:81:81:System message bus:/:/sbin/nologin

具体操作(2)删除功能

[root@localhost sed]# sed '1,14'd test.txt  (sed可以用于删除行,此方法可以用于删除日志中的早期文件)
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
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
mxk:x:1000:1000::/home/mxk:/bin/bash
[root@localhost sed]# wc -l test.txt  (虽然能删除,但只是在屏幕上显示删除后剩余的行,但是不会删除具体的内容)
22 test.txt
[root@localhost sed]# cp test.txt  123tset.txt  (先备份一份)
[root@localhost sed]# ls
123tset.txt  test.txt
[root@localhost sed]# sed -i '1,14'd test.txt   (-i选项会直接删除文件内容)
[root@localhost sed]# wc -l test.txt 
8 test.txt
[root@localhost sed]# cat test.txt 
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
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
mxk:x:1000:1000::/home/mxk:/bin/bash  (mxk相关的行存在)
[root@localhost sed]# sed -i '/mxk/'d test.txt   (还可以删除掉指定字符的行)
[root@localhost sed]# cat test.txt 
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
chrony:x:998:996::/var/lib/chrony:/sbin/nologin (已经不存在mxk相关的行)

具体操作(3)替换功能

[root@localhost sed]# sed '1,10s/root/toor/g' 123tset.txt   (查找替换,将root替换为toor,g表示全局替换)
toor:x:0:0:toor:/toor:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
......(中间省略)
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
mxk:x:1000:1000::/home/mxk:/bin/bash
[root@localhost sed]# sed -r '1,10s/ro+/r/g' 123tset.txt |head  (特殊符号也可以识别,在不加脱义符的情况下,要加-r) 
rt:x:0:0:rt:/rt:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
aldfjhadfuenveu123
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
581475aduhfgnaui
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/syncBus
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
将每一行:分割的第一列和最后一列替换
[root@localhost sed]# head 123tset.txt  (这是前10行的显示)
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
aldfjhadfuenveu123
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
581475aduhfgnaui
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/syncBus
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
[root@localhost sed]# head 123tset.txt |sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' 
(命令解释:-r是为了在不加脱义符的情况下识别特殊符号,小括号是为了调取内容,第一个中括号表示每一行非空的开头,第二个小括号表示第二个:后边的通配到第三个:结束,第三个:对应每一行的最后一个:,最后一个()表示每一行最后一列的内容,后边的\3:\2:\1是将第一个()和第三个()调换)
前边用()表示调用的后边就可以用反斜杠\表示
/bin/bash:x:0:0:root:/root:root
/sbin/nologin:x:1:1:bin:/bin:bin
aldfjhadfuenveu123
/sbin/nologin:x:2:2:daemon:/sbin:daemon
/sbin/nologin:x:3:4:adm:/var/adm:adm
581475aduhfgnaui
/sbin/nologin:x:4:7:lp:/var/spool/lpd:lp
/bin/syncBus:x:5:0:sync:/sbin:sync
/sbin/shutdown:x:6:0:shutdown:/sbin:shutdown
/sbin/halt:x:7:0:halt:/sbin:halt
[root@localhost sed]# head 123tset.txt |sed 's//root/123/g' (将root替换成123,由于/过多无法识别,应该加\脱义如下命令)
sed:-e 表达式 #1,字符 12:“s”的未知选项
[root@localhost sed]# head 123tset.txt |sed 's/\/root/123/g'
root:x:0:0:root:123:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
aldfjhadfuenveu123
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
581475aduhfgnaui
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/syncBus
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
[root@localhost sed]# head 123tset.txt |sed 's@/root@123@g'  (也可以用其他特殊字符代替/,只要是能识别需要替换内容中的/即可,不然无法识别)
root:x:0:0:root:123:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
aldfjhadfuenveu123
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
581475aduhfgnaui
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/syncBus
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

具体操作(4)删除字母功能

[root@localhost sed]# head 123tset.txt |sed 's/[a-zA-Z]//g'  (中括号里边是范围,将这些范围中的内容替换成没有内容,就不在打印范围内的内容)
::0:0::/://
::1:1::/://
123
::2:2::/://
::3:4:://://
581475
::4:7::///://
::5:0::/://
::6:0::/://
::7:0::/://

具体操作(5)给所有行前边加上某一个字符功能

[root@localhost sed]# head 123tset.txt |sed -r 's/(.*)/aaa:&/' (&表示小括号内调用的内容)
aaa:root:x:0:0:root:/root:/bin/bash
aaa:bin:x:1:1:bin:/bin:/sbin/nologin
aaa:aldfjhadfuenveu123
aaa:daemon:x:2:2:daemon:/sbin:/sbin/nologin
aaa:adm:x:3:4:adm:/var/adm:/sbin/nologin
aaa:581475aduhfgnaui
aaa:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
aaa:sync:x:5:0:sync:/sbin:/bin/syncBus
aaa:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
aaa:halt:x:7:0:halt:/sbin:/sbin/halt

三、awk介绍

AWK是一种处理文本文件的语言,是一个强大的文本分析工具

1、awk命令格式:

awk [options] 'script' var=value file(s)  
awk [options] -f scriptfile var=value file(s)   

选项

-F fs          fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:
-v var=value   赋值一个用户定义变量,将外部变量传递给awk
-f scripfile   从脚本文件中读取awk命令
-m[fr] val     对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。  

具体操作(1)

[root@localhost ~]# mkdir awk
[root@localhost ~]# cp /etc/passwd awk/test.txt
[root@localhost ~]# cd awk
[root@localhost awk]# ls
test.txt
[root@localhost awk]# awk -F ':' '{print $1}' test.txt  (-F,指定分割符,打印第一列内容)
root
bin
daemon
adm
......(中间省略)
postfix
sshd
chrony
mxk
[root@localhost awk]# awk -F ':' '{print $0}' test.txt  (打印全部内容)
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
......(中间省略)
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
mxk:x:1000:1000::/home/mxk:/bin/bash
[root@localhost awk]# awk '{print $0}' test.txt   (在不指定分隔符的情况下打印全部)
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
......(中间省略)
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
mxk:x:1000:1000::/home/mxk:/bin/bash
[root@localhost awk]# vim 1.txt
[root@localhost awk]# cat 1.txt 
11 22
aa ss
zz xx
ma xiao kang11 22
[root@localhost awk]# awk '{print $1}' 1.txt   (在不指定的情况下,会默认空格等其他字符)
11
aa
zz
ma
[root@localhost awk]# awk -F ':' '{print $1,$3,$4}' test.txt   (也可以分开打印其他列)
root 0 0
bin 1 1
......(中间省略)
chrony 998 996
mxk 1000 1000
[root@localhost awk]# awk -F ':' '{print $1"#"$3"#"$4}' test.txt  (用#好分割打印出来的结果)
root#0#0
bin#1#1
daemon#2#2
......(中间省略)
chrony#998#996
mxk#1000#1000

具体操作(2)匹配功能

[root@localhost awk]# awk '/oo/' test.txt   (可以在不加任何选项的情况下直接匹配,打印出含有oo的行)
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@localhost awk]# awk -F ':' '$1 ~ /oo/' test.txt  (打印出第一段含有oo的)
root:x:0:0:root:/root:/bin/bash
[root@localhost awk]# awk -F ':' '$1 ~ /o+/' test.txt  (也可以使用正则表达式,打印出第一段和o有关)
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
operator:x:11:0:operator:/root:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
[root@localhost awk]# awk -F ':' '$1 ~ /oo+/' test.txt 
root:x:0:0:root:/root:/bin/bash
[root@localhost awk]# awk -F ':' '/root/{print $1,$3} /uesr/ {print $3,$4}'  test.txt   (进行多个表达式一起执行,打印出第一段,第三段含有root的行以及第3段、第4段含有user的行)
root 0
operator 11
[root@localhost awk]# awk -F ':' '/root/{print $1,$3} /mxk/ {print $1,$3,$4}' test.txt 
root 0
operator 11
mxk 1000 1000
[root@localhost awk]# awk -F ':' '/root|mxk/ {print $0}' test.txt  (可以将两个表达式放在一起执行)
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
mxk:x:1000:1000::/home/mxk:/bin/bash

具体操作(3)数学运算

[root@localhost awk]# awk -F ':' '$3==0 {print $1}' test.txt  (打印出第三段等于0的第一段)
root
[root@localhost awk]# awk -F ':' '$3>=1000 {print $1}' test.txt  (打印出第三段大于1000的第一段) 
mxk
[root@localhost awk]# awk -F ':' '$3>=1000 {print $0}' test.txt   (打印出第3段等于0的所有段)
mxk:x:1000:1000::/home/mxk:/bin/bash
[root@localhost awk]# awk -F ':' '$3>="1000" {print $0}' test.txt  (当给数字加上“”,就不在识别是数字,而是字符串,所以第三段会根据ASCII码排序)
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
......(中间省略)
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
mxk:x:1000:1000::/home/mxk:/bin/bash
[root@localhost awk]# awk -F ':' '$7!="/sbin/nologin" {print $0}' test.txt  (如此命令,就是打印出第7段不等于/sbin/nologin这个字符的所有段) 
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mxk:x:1000:1000::/home/mxk:/bin/bash
[root@localhost awk]# awk -F ':' '$3<$4' test.txt (可以指定段与段之间的比较,打印出第三段比第四段小的)
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
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@localhost awk]# awk -F ':' '$3=$4' test.txt   (打印出第三段和第四段相同的)
bin x 1 1 bin /bin /sbin/nologin
daemon x 2 2 daemon /sbin /sbin/nologin
......(中间省略)
chrony x 996 996  /var/lib/chrony /sbin/nologin
mxk x 1000 1000  /home/mxk /bin/bash
[root@localhost awk]# awk -F ':' '$3>"5" && $3<"7"' test.txt   (可以多个条件共同作用的,打印出第三段大于5且第三段小于7的)
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
[root@localhost awk]# awk -F ':' '$3>1000 || $7="/sbin/sologin"' test.txt  (打印出第三段大于1000或者第七段为/sbin/sologin的)
root x 0 0 root /root /sbin/sologin
bin x 1 1 bin /bin /sbin/sologin
......(中间省略)
chrony x 998 996  /var/lib/chrony /sbin/sologin
mxk x 1000 1000  /home/mxk /sbin/sologin 
[root@localhost awk]# awk -F ':' '$3>1000 || $7 ~ /bash/' test.txt  (打印出第三段大于1000或者第七段匹配到bash的) 
root:x:0:0:root:/root:/bin/bash
mxk:x:1000:1000::/home/mxk:/bin/bash

具体操作(4)内置变量

[root@localhost awk]# awk -F ':' '{OFS="#"} $3>1000 || $7 ~ /bash/ {print $1,$3,$7}' test.txt   (OFS是指定打印出来的内容之间用#隔开)
root#0#/bin/bash
mxk#1000#/bin/bash
[root@localhost awk]# awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$3,$7}}' test.txt 
xiaokang#1001#/bin/bash
xiaokang1#1002#/bin/bash
xiaokang2#1003#/bin/bash
xiaokang3#1004#/bin/bash
[root@localhost awk]# awk -F ':' '{print NR":"$0}' test.txt  (变量NR会显示该文件的行,¥0代表全部)
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
......(中间省略)
23:xiaokang2:x:1003:1004::/home/xiaokang2:/bin/bash
24:xiaokang3:x:1004:1005::/home/xiaokang3:/bin/bash
[root@localhost awk]# awk -F ':' '{print NF":"$0}' test.txt   (变量NF会显示每一行都有多少段,显示每行都是7段)
7:root:x:0:0:root:/root:/bin/bash
7:bin:x:1:1:bin:/bin:/sbin/nologin
......(中间省略)
7:xiaokang2:x:1003:1004::/home/xiaokang2:/bin/bash
7:xiaokang3:x:1004:1005::/home/xiaokang3:/bin/bash
[root@localhost awk]# vi test.txt  (更改文件内容)
[root@localhost awk]# awk -F ':' '{print NF":"$0}' test.txt  (会显示出有6段的内容)
6:x:0:0:root:/root:/bin/bash
7:bin:x:1:1:bin:/bin:/sbin/nologin
......(中间省略)
7:xiaokang2:x:1003:1004::/home/xiaokang2:/bin/bash
6:x:1004:1005::/home/xiaokang3:/bin/bash
[root@localhost awk]# awk -F ':' 'NR<=10' test.txt   (打印出前10行的内容)
x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
......(中间省略)
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost awk]# awk -F ':' 'NR<=10 && $1 ~ /root|sync/' test.txt (打印出前10行的内容,且第一段可以匹配到root或者sync的内容)  
sync:x:5:0:sync:/sbin:/bin/sync
[root@localhost awk]# awk -F ':' 'NF==6' test.txt 
x:0:0:root:/root:/bin/bash
x:1004:1005::/home/xiaokang3:/bin/bash
[root@localhost awk]# awk -F ':' '{print $NR":"$NF}' test.txt 
x:/bin/bash
x:/sbin/nologin
2:/sbin/nologin
4:/sbin/nologin
lp:/sbin/nologin
/sbin:/bin/sync
/sbin/shutdown:/sbin/shutdown
:/sbin/halt
......(中间省略)
:/bin/bash
:/bin/bash

具体操作(5)

[root@localhost awk]# head -n 3 /etc/passwd |awk -F ':' '$1="root"'  (一个等于号是赋值)
root x 0 0 root /root /bin/bash
root x 1 1 bin /bin /sbin/nologin
root x 2 2 daemon /sbin /sbin/nologin
[root@localhost awk]# head -n 3 /etc/passwd |awk -F ':' '$1=="root"'   (两个等于号是等于的值)
root:x:0:0:root:/root:/bin/bash
[root@localhost awk]# head -n 3 test.txt |awk -F ':' '{OFS=":"}$1="root"'  (可以定义OFS来显示打印的分隔符) 
root:0:0:root:/root:/bin/bash
root:x:1:1:bin:/bin:/sbin/nologin
root:x:2:2:daemon:/sbin:/sbin/nologin
[root@localhost awk]# awk -F ':' '{(tot=tot+$3)}; END {print tot}'   test.txt  (tot表示累加值,表示将所有行的第三段值加起来,并打印出来) 
7616

转载于:https://my.oschina.net/u/3850989/blog/1825096

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值