正則表達式,又稱規則表達式,計算機科學的一個概念,正則表達式是對字符串操做的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個「規則字符串」,這個「規則字符串」用來表達對字符串的一種過濾邏輯,在不少文本編輯器或其餘工具裏,正則表達式一般被用來檢索和/或替換那些符合某個模式的文本內容。許多程序設計語言都支持利用正則表達式進行字符串操做。
元字符
. 點匹配任意一個字符
* 星號匹配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」能夠直接使用,不用額外脫意)。正則表達式
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的行
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 ...
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