2018-06-04筆記(正則、grep、sed、awk工具)

9.1 正則介紹

正則表達式,又稱規則表達式,計算機科學的一個概念,正則表達式是對字符串操做的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個「規則字符串」,這個「規則字符串」用來表達對字符串的一種過濾邏輯,在不少文本編輯器或其餘工具裏,正則表達式一般被用來檢索和/或替換那些符合某個模式的文本內容。許多程序設計語言都支持利用正則表達式進行字符串操做。
元字符
. 點匹配任意一個字符
* 星號匹配0個或多個*號前面的字符,例如:a*表示0個或多個a,(0-n)
.* 點星表示通配符,任意個任意字符,即全部都匹配
? 問號匹配0個或1個?號前面的字符(0-1) (除了 awk,grep和sed須要脫意,「grep -E=egrep」 和「sed -r」能夠直接使用,不用額外脫意)
+ 加號匹配1個或多個+號前面的字符 (1-n)通常須要脫意使用(除了 awk,grep和sed須要脫意,「grep -E=egrep」 和「sed -r」能夠直接使用,不用額外脫意)
\ 脫意符,把有特殊含義的字符還原成普通字符
^ 匹配一行的開頭,如:^what匹配以what開頭的行
$ 匹配一行的結尾,如:what$匹配以what結尾的行
[ ] 匹配括號中的任何一個字符,如:[0-2]表示匹配0,1,2中的任意一個,[23]表示匹配2或者3,不是23
<, > 匹配單詞(如:what)的開始(<)和結束(>)通常須要脫意使用(除了 awk,grep和sed須要脫意,「grep -E=egrep」 和「sed -r」能夠直接使用,不用額外脫意)。mysql

| 將兩個匹配條件進行邏輯「或」(Or)運算。 通常須要脫意使用(除了 awk,grep和sed須要脫意,「grep -E=egrep」 和「sed -r」能夠直接使用,不用額外脫意)。nginx

? 匹配0或1個正好在它以前的那個字符。 通常須要脫意使用(除了 awk外,grep和sed須要脫意,「grep -E=egrep」 和「sed -r」能夠直接使用,不用額外脫意)。web

{n} {n1,n2}: 匹配前面字符出現的次數,如:a{2}表示a出現2次,a{2,5}表示a出現2到5次,通常須要脫意使用(除了 awk外,grep和sed須要脫意,「grep -E=egrep」 和「sed -r」能夠直接使用,不用額外脫意)。正則表達式

9.2grep / egrep工具

grep是一種強大的文本搜索工具,針對行進行操做,它能使用正則表達式搜索文本,並把匹配的行打印出來,egrep是grep的擴展
語法: grep [options] ‘關鍵字’ filename
Options:
-c:=count 行數,只顯示匹配的總行數,不顯示行的內容
-i:=ignore-case 不區分大小寫
-n:=line-number 顯示行號
-v:=revert-match 取反
-r,-R:=recursive(遞歸的,循環的)讀取目錄下的全部文件,包括子目錄
-A:後面跟數字,過濾出符合要求的行以及下面n行
-B:同上,過濾出符合要求的行以及上面n行
-C:同上,同時過濾出符合要求的行以及上下各n行
-E:‘grep -E’ = egrep
一、不加任何選項,只過濾出關鍵字所在的行,並把行的內容打印出來sql

[root@localhost tmp]# grep 'root' test.txt 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

在Linux中,grep默認帶color選項bash

[root@localhost tmp]# which grep 
alias grep='grep --color=auto'
    /usr/bin/grep

二、-c只顯示匹配的總行數,不顯示行的內容ssh

[root@localhost tmp]# grep -c 'root' test.txt                  #上面搜索出來有兩行,全部這裏顯示2
2

三、-n打印符合的行,並把行號顯示出來tcp

[root@localhost tmp]# grep -n 'root' test.txt                #能夠看到第1行和11行都有root
1:root:x:0:0:root:/root:/bin/bash
11:operator:x:11:0:operator:/root:/sbin/nologin

四、-i不區分關鍵字的大小寫,會把整個文檔都遍歷一次,速度較慢編輯器

[root@localhost tmp]# echo "ROot/ROOT/" >>test.txt             #追加一行大小寫混合的行到 test.txt
[root@localhost tmp]# grep -i 'root' test.txt                               #能夠看到無論大寫和小寫均可以匹配
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ROot/ROOT/

五、-v取向,把不包含關鍵字的行顯示出來ide

[root@localhost tmp]# grep -v 'nologin' test.txt 
root:x:0:0:root:/root:/bin/bash
yy:iji#adklfjdl@fkjdkl?jfdkjk
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
luo:x:1001:1006::/home/luo:/bin/bash
ROot/ROOT/

六、-r/-R遍歷目錄下的(包括子目錄下的)全部文件,把匹配的行顯示出來

[root@adai003 localhost tmp]# tree                  #能夠看到tmp目錄下還有grep目錄,grep目錄下有個test1.txt文件
.
├── grep
│   └── test1.txt
└── test.txt
[root@localhost tmp]# grep -r 'root'                  #後面不加目錄,表示過濾當前目錄下的全部文件
test.txt:root:x:0:0:root:/root:/bin/bash
test.txt:operator:x:11:0:operator:/root:/sbin/nologin
grep/test1.txt:root:x:0:0:root:/root:/bin/bash
grep/test1.txt:operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost tmp]# grep -R 'root'
test.txt:root:x:0:0:root:/root:/bin/bash
test.txt:operator:x:11:0:operator:/root:/sbin/nologin
grep/test1.txt:root:x:0:0:root:/root:/bin/bash
grep/test1.txt:operator:x:11:0:operator:/root:/sbin/nologin

七、-A後面跟數字n,表示過濾出符合要求的行以及下面n行

[root@localhost tmp]# grep -A2  'root' test.txt      #這裏把匹配‘root'的行和後面兩行都打印出來
root:x:0:0:root:/root:/bin/bash
yy:iji#adklfjdl@fkjdkl?jfdkjk
bin:x:1:1:bin:/bin:/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,表示過濾出符合要求的行以及下面n行

[root@localhost tmp]# grep -B2 'mail' test.txt 
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
--
luo:x:1001:1006::/home/luo:/bin/bash
saslauth:x:997:76:Saslauthd user:/run/saslauthd:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin

九、-C後面跟數字n,表示過濾出符合要求的行以及上面n行和下面n行

[root@localhost tmp]# grep -C2 'luo' test.txt 
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
luo:x:1001:1006::/home/luo:/bin/bash
saslauth:x:997:76:Saslauthd user:/run/saslauthd:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin

grep正則表達式的一些應用
一、把包含數字的行顯示過濾出來

[root@localhost tmp]# grep '[0-9]' test.txt 
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
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
luo:x:1001:1006::/home/luo:/bin/bash
saslauth:x:997:76:Saslauthd user:/run/saslauthd:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
nginx:x:996:995:Nginx web server:/var/lib/nginx:/sbin/nologin
mysql:x:1002:1002::/home/mysql:/sbin/nologin

二、過濾出不包含數字的行

[root@localhost tmp]# grep -v '[0-9]' test.txt
yy:iji#adklfjdl@fkjdkl?jfdkjk
ROot/ROOT/

三、過濾出以#號開頭的行

[root@localhost tmp]# grep  '^#' /etc/inittab 
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target
#

四、過濾出不以#號開頭的行,並把空行去掉

[root@localhost tmp]# grep -v '^#' /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

[root@localhost tmp]# grep -v '^#' /etc/crontab|grep -v '^$'
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

五、過濾任意一個字符與重複字符

[root@localhost tmp]# grep 'r.o' test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

[root@localhost tmp]# grep 'o*t' test.txt                           #表示出現了零次或者屢次o後面是t的字符
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
tcpdump:x:72:72::/:/sbin/nologin
saslauth:x:997:76:Saslauthd user:/run/saslauthd:/sbin/nologin
ROot/ROOT/

六、過濾字符指定出現的次數

[root@localhost tmp]# grep 'o\{2\}' test.txt                                 #o\{2\}這裏表示o出現2次,也能夠是一個範圍\{2,5\}表示出現2到5次
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
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin

egrep應用
egrep 'o{2}'=grep -E 'o {2}' = grep 'o\ {2\ }'

[root@localhost tmp]# egrep 'o{2}' test.txt
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
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin

[root@localhost tmp]# grep -E 'o{2}' test.txt
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
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin

egrep 'oo+' 表示oo出現1到或者屢次

[root@localhost tmp]# egrep 'oo+' test.txt
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
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin

egrep 'root|luo' test.txt表示匹配root或者luo全部的行,|表示或者

[root@localhost tmp]# egrep 'root|luo' test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
luo:x:1001:1006::/home/luo:/bin/bash

擴展:
過濾一個目錄下全部某類型文檔中含有某字符的行:

[root@localhost tmp]# grep -r "--include=*.txt" 'root'  ./
./test.txt:root:x:0:0:root:/root:/bin/bash
./test.txt:operator:x:11:0:operator:/root:/sbin/nologin
./grep/test1.txt:root:x:0:0:root:/root:/bin/bash
./grep/test1.txt:operator:x:11:0:operator:/root:/sbin/nologin

說明: 過濾當前目錄下全部.txt文件中含有字符串root的行

9.3sed工具

sed經常使用來打印某行或者查找替換
經常使用選項:
-n 僅顯示處理後的結果
-r 去義,不用再另外脫義
-e能夠多個行爲一塊兒處理
-i直接修改文件
一、打印某行,打印行爲要配合-n選項使用

[root@localhost tmp]# sed -n '3'p test.txt
bin:x:1:1:bin:/bin:/sbin/nologin

把第一行到最後一行打印出來

[root@localhost tmp]# sed -n '1,$'p test.txt
root:x:0:0:root:/root:/bin/bash
yy:iji#adklfjdl@fkjdkl?jfdkjk
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
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
luo:x:1001:1006::/home/luo:/bin/bash
saslauth:x:997:76:Saslauthd user:/run/saslauthd:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
nginx:x:996:995:Nginx web server:/var/lib/nginx:/sbin/nologin
mysql:x:1002:1002::/home/mysql:/sbin/nologin
ROot/ROOT/
3453535

指定打印的區間:

[root@localhost tmp]# sed -n '1,3'p test.txt
root:x:0:0:root:/root:/bin/bash
yy:iji#adklfjdl@fkjdkl?jfdkjk
bin:x:1:1:bin:/bin:/sbin/nologin

二、打印包含某個字符串的行

[root@localhost tmp]# sed -n '/root/'p test.txt                           #匹配字符串的時候兩邊要加上//
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

打印一個區間內包含字符串的行

[root@localhost tmp]# sed -n '1,10{/root/p}' test.txt
root:x:0:0:root:/root:/bin/bash

三、刪除某行或者多行
sed 刪除不用配合-n使用

[root@localhost tmp]# sed '1'd test.txt                     ##刪除第一行,把剩下的顯示出來
yy:iji#adklfjdl@fkjdkl?jfdkjk
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
...

[root@localhost tmp]# sed '1,3'd test.txt                     ###刪除第一行到第三行,把剩下的顯示出來
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
...

[root@localhost tmp]# sed '/root/'d test.txt                 ###刪除包含root的行,把剩下的顯示出來
yy:iji#adklfjdl@fkjdkl?jfdkjk
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
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
...

四、替換字符或字符串
‘s’ 就是替換的命令, ‘g’ 爲本行中全局替換,若是不加 ‘g’ 只換該行中出現的第一個。除了可使用 ‘/’ 做爲分隔符外,還可使用其餘特殊字符例如 ‘#’ 或者 ‘@’ 都沒有問題。

[root@localhost tmp]# sed 's/root/toor/g' test.txt                     #把全部行的root替換成toor
toor:x:0:0:toor:/toor:/bin/bash
yy:iji#adklfjdl@fkjdkl?jfdkjk
bin:x:1:1:bin:/bin:/sbin/nologin
operator:x:11:0:operator:/toor:/sbin/nologin
...

指定替換的區間

[root@localhost tmp]# sed '1,3 s/root/toor/g' test.txt                #把1到3行的root替換成toor,若是是1到最後一行'1,$'
toor:x:0:0:toor:/toor:/bin/bash
yy:iji#adklfjdl@fkjdkl?jfdkjk
bin:x:1:1:bin:/bin:/sbin/nologin
...

把全部的數字替換成空,即去除全部的數字

[root@localhost tmp]# sed 's/[0-9]//g' test.txt
root:x:::root:/root:/bin/bash
yy:iji#adklfjdl@fkjdkl?jfdkjk
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
lp:x:::lp:/var/spool/lpd:/sbin/nologin
sync:x:::sync:/sbin:/bin/sync
shutdown:x:::shutdown:/sbin:/sbin/shutdown
halt:x:::halt:/sbin:/sbin/halt
mail:x:::mail:/var/spool/mail:/sbin/nologin
operator:x:::operator:/root:/sbin/nologin
games:x:::games:/usr/games:/sbin/nologin
ftp:x:::FTP User:/var/ftp:/sbin/nologin
nobody:x:::Nobody:/:/sbin/nologin
systemd-network:x:::systemd Network Management:/:/sbin/nologin
dbus:x:::System message bus:/:/sbin/nologin
polkitd:x:::User for polkitd:/:/sbin/nologin
postfix:x::::/var/spool/postfix:/sbin/nologin
sshd:x:::Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x::::/var/lib/chrony:/sbin/nologin
rpc:x:::Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:::RPC Service User:/var/lib/nfs:/sbin/nologin
tcpdump:x::::/:/sbin/nologin
luo:x::::/home/luo:/bin/bash
saslauth:x:::Saslauthd user:/run/saslauthd:/sbin/nologin
mailnull:x::::/var/spool/mqueue:/sbin/nologin
smmsp:x::::/var/spool/mqueue:/sbin/nologin
nginx:x:::Nginx web server:/var/lib/nginx:/sbin/nologin
mysql:x::::/home/mysql:/sbin/nologin
ROot/ROOT/

五、調換兩個字符串的位置

[root@localhost tmp]# sed -r 's/(root)(.*)(bash)/\3\2\1/' test.txt
bash:x:0:0:root:/root:/bin/root
...

說明:用 () 把所想要替換的字符括起來成爲一個總體,由於括號在sed中屬於特殊符號,因此須要在前面加脫意字符 \,也可使用sed -r 替換時則寫成 ‘1’, ‘‘2’, ‘‘3’ 的形式
六、在某一行前或者後增長指定內容

[root@localhost tmp]# sed '1,2 s/^.*$/& 333/g' test.txt          ##在1,2行的後面加上空格333
root:x:0:0:root:/root:/bin/bash 333
yy:iji#adklfjdl@fkjdkl?jfdkjk 333

[root@localhost tmp]# sed '1,2 s/^.*$/333 &/g' test.txt             ## ##在1,2行的前面加上333空格
333 root:x:0:0:root:/root:/bin/bash
333 yy:iji#adklfjdl@fkjdkl?jfdkjk

七、直接修改文件的內容

[root@localhost tmp]# sed -i 's/root/toor/' test.txt           #沒有任何輸出,直接修改文件 內容
[root@localhost tmp]# cat test.txt 
toor:x:0:0:root:/root:/bin/bash
...

9.4awk工具

awk和sed同樣是流式編輯器,它也是針對文檔中的行來操做的,一行一行的去執行
awk語法結構:
awk -F ':' 'BEGIN{語句} {if(條件){語句1;語句2;語句3} } END{語句}' filename
FS指定分隔符 也可使用-F指定
OFS指定輸出的分隔符
NR行號
NF段號$NF表示最後一段
$0表示整行
$1表示第1段,依次類推$2表示第2段 $3...
一、截取文檔中的某個段

[root@localhost tmp]# awk -F":" '{print $1}' test.txt 
toor
yy
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games

二、打印自定義的內容,自定義的內容要用雙引號引發來

[root@localhost tmp]# awk -F':' '{print $1"#"$2"#"$3}' test.txt 
toor#x#0
yy#iji#adklfjdl@fkjdkl?jfdkjk#
bin#x#1
daemon#x#2
adm#x#3
lp#x#4

三、定義輸出分隔符

[root@localhost tmp]# awk -F':' ' OFS="@" {print $1,$2,$3}' test.txt 
toor@x@0
yy@iji#adklfjdl@fkjdkl?jfdkjk@
bin@x@1
daemon@x@2
adm@x@3
lp@x@4

四、使用多個分隔符

[root@localhost tmp]# cat 1.txt
zhang:460 luo:560                                         #這裏咱們想打印460和560可使用多個分隔符
[root@localhost tmp]# awk -F ":| " '{print $2,$4}' 1.txt          #把冒號和空格都看成分隔符來使用
460 560

五、匹配字符或字符串

[root@localhost tmp]# awk '/root/' test.txt                      #這裏和sed同樣匹配字符串的時候兩邊要加上//
toor:x:0:0:root:/root:/bin/bash

指定哪段匹配

[root@localhost tmp]# awk -F ":" '$1~/toor/' test.txt
toor:x:0:0:root:/root:/bin/bash

六、條件操做
awk中是能夠用邏輯符號判斷的,好比 ‘==’ 就是等於,也能夠理解爲 ‘精確匹配’ 另外也有 >, ‘>=, ‘<, ‘<=, ‘!= 等等,值得注意的是,在和數字比較時,若把比較的數字用雙引號引發來後,那麼awk不會認爲是數字,而認爲是字符,不加雙引號則認爲是數字

[root@localhost tmp]# awk -F ':' '$3==0' test.txt                   #把第三段等於0的匹配出來
toor:x:0:0:root:/root:/bin/bash

[root@localhost tmp]# awk -F":" '$1="aaa"' test.txt               #給第一段賦值,字符串要用雙引號引發來
aaa x 0 0 root /root /bin/bash
aaa iji#adklfjdl@fkjdkl?jfdkjk
aaa x 1 1 bin /bin /sbin/nologin
aaa x 2 2 daemon /sbin /sbin/nologin
aaa x 3 4 adm /var/adm /sbin/nologin

[root@localhost tmp]# awk -F':' '$3<1' test.txt                #把第三段小於1的匹配出來
toor:x:0:0:root:/root:/bin/bash
yy:iji#adklfjdl@fkjdkl?jfdkjk
ROot/ROOT/

&& 表示 「而且」

[root@localhost ~]# awk -F ':' '$3>"5" && $3<"7"' /etc/passwd
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
user11:x:510:502:user11,user11's office,12345678,123456789:/home/user11:/sbin/nologin
test:x:511:511::/home/test:/bin/bash
test1:x:512:511::/home/test1:/bin/bash

||表示或者

[root@localhost ~]# awk -F ':' '$3>"5" || $7=="/bin/bash"' /etc/passwd
root:x:0:0:root:/root:/bin/bash
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
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
user11:x:510:502:user11,user11's office,12345678,123456789:/home/user11:/sbin/nologin
test:x:511:511::/home/test:/bin/bash
test1:x:512:511::/home/test1:/bin/bash

七、打印段數或者行號

[root@localhost tmp]# awk -F':' '{print NF}' test.txt|head -3                     #顯示前三行的段數
7
2
7

[root@localhost tmp]# awk -F':' '{print $NF}' test.txt                         #打印最後一段
/bin/bash
iji#adklfjdl@fkjdkl?jfdkjk
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
...

[root@localhost tmp]# awk '{print NR}' test.txt                                  #打印行號
1
2
3
4
5
6
7
8
9
10
...

八、計算某個段的總和

[root@localhost tmp]# awk -F':' '{(sum=sum+$3)} END{print sum}' test.txt 
6832
也能夠寫成這樣
[root@localhost tmp]# awk -F':' '{(sum+=$3)} END{print sum}' test.txt 
6832

九、if判斷

[root@localhost tmp]# awk -F':' '{if($3==0) print $1}' test.txt 
toor
相關文章
相關標籤/搜索