在linux中,用到正则表达的常用工具有:grep,sed,awk等。
-c(count) :打印符合要求的行数 -i (ignore-case):忽略大小写 -n (line-number):在输出符合要求的行的同时连同行号一起输出 -v (invert-natch):打印不符合要求的行 -A (after-context):后跟一个数字(有无空格都可以),例如 –A2则表示打印符合要求的行以及下面两行 -B (before-context):后跟一个数字,例如 –B2 则表示打印符合要求的行以及上面两行 -C (context):后跟一个数字,例如 –C2 则表示打印符合要求的行以及上下各两行 ^ :表示行的开始 $ :表示行的结尾 -E :表示组合
|
cat pwd
root:x:0:0:root:/root:/bin/bash root:x:0:0:Root:/root:/bin/root 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 chrony:x:998:996::/var/lib/chrony:/sbin/nologin apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin zabbix:x:997:995:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin nginx:x:996:994:Nginx web server:/var/lib/nginx:/sbin/nologin named:x:25:25:Named:/var/named:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin
1 包含root
cat pwd | grep "root"
2 顺便打印行数
cat pwd | grep -n "root"
3 不区分大小写或精准匹配
cat pwd | grep -n -i "root"
cat pwd | grep -n -w "root"
4 反选
cat pwd | grep -n -v "root"
5 组合
cat pwd | grep -n -E "root|mysql"
6 以root开始
cat pwd | grep -n "^root"
7 以root结尾
cat pwd | grep -n "root$"
8 -A -B -C
cat pwd | grep -n -A2 "root"
cat pwd | grep -n -B2 "root"
cat pwd | grep -n -C2 "root"
9 字符. 任意一个字符
cat pwd | grep -n "r..t"
10 字符*
表示零个或多个前面的字符。
cat pwd | grep -n "ro*t"
sed全称是:Stream EDitor。(流编辑器)
语法:sed 参数 文件 -e command,–expression=command允许多台编辑。 -h,–help打印帮助,并显示bug列表的地址。 -n,–quiet,–silent取消默认输出。 -f,–filer=script-file引导sed脚本文件名。 -V,–version打印版本和版权信息。 |
cat ttt
1111 2222 3333 4444 5555 6666 7777
p表示打印行。
1 一行
cat ttt | sed -n "1p"
2 多行
cat ttt | sed -n "1,3p"
3 包含某个字符串的行
cat ttt | sed -n "/111/p"
4 -e可以实现多个行为
cat ttt | sed -n -e "1p" -e "/222/p"
5 替换字符或字符串:
‘s’ 就是替换的命令, ‘g’ 为本行中全局替换,如果不加 ‘g’ 只换该行中出现的第一个。
除了可以使用 ‘/’ 作为分隔符外,还可以使用其他特殊字符例如 ‘#’ 或者 ‘@’ 都没有问题。
sed '1s/11/ggg/g' ttt
6 直接修改文件的内容
sed -i '2s/22/gg/g' ttt
awk是一个报告生成器,拥有强大的文本格式化能力。它的命名方式也是由三位大佬,分别叫Aho,Weinberger,Kernighan,的三个人,awk命令取得他们的名字首字母。
awk基本语法:
awk [option] 'pattern{action}' file1,file2,...filen
cat testpwd
root:x:0:0:root:/root:/bin/bash root:x:0:0:Root:/root:/bin/root 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
cat awk_test.txt
name age score lqd 45 87 my 47 88 wrz 25 98 wnz 56 98
-F 选项的作用是指定分隔符,默认空格或者tab为分隔符。 Print为打印的动作,用来打印出某个字段。
\$1为第一个字段,\$2为第二个字段,依次类推,有一个特殊的那就是$0,它表示整行。
1 截取文档中的某个段:
cat awk_test.txt | awk '{print $1}'
2 匹配字符或字符串
cat awk_test.txt | awk '/name/'
cat awk_test.txt | awk '/name/{print $2}'
cat awk_test.txt | awk '/name/{print $2,$3}'
3 条件操作符:
awk中是可以用逻辑符号判断的,比如 ‘==’ 就是等于,另外也有 >, ‘>=, ‘<, ‘<=, ‘!= 等等
cat testpwd | awk -F ":" '$3>1 {print $3}'
cat testpwd | awk -F ":" '$3>1 {print $1}'
4 awk的内置变量:
NR 行号,当前处理文本行的行号
NF 当前行的字段的个数
不止两个
cat testpwd | awk -F ":" '{print NR}'
cat testpwd | awk -F ":" '{print NF}'