1. 程式人生 > >Linux 四劍客介紹和案例

Linux 四劍客介紹和案例

次數 test 根據 nologin 沒有 元字符 如何 log 執行指定

正則表達式

Linux中文本處理工具:
grep(只支持基礎正則表達式)
egrep(支持擴展正則表達式)
sed (支持擴展正則表達式)
awk (支持基礎正則表達式支持擴展正則表達式)

基礎正則表達式元字符:

\ :轉義字符,!,\n 等
^ :匹配字符串開始的位置 如:^a:以a開頭的字符
$ :匹配字符串結束的位置 如:word$:以word結束的位置
. : 匹配/n之外的任意的一個字符 如:go.d:匹配good .代表任意字符可以是多個

  • :匹配前面子表達式 0此或者多次 如:good :匹配good星號前面的子表達式多個或0個 如 gooood gooooooood
    [list] : 匹配list列表中的一個字符 如 go[old]d:匹配good或gold或 godd
    [^list]: 匹配任意不在list列表中的一個子符 如[^list] :匹配不含有list的字符
    {n,m}:匹配前面的子表達式n到m次,有{n},{n,},{n,m}三種格式 如:go{2}d:匹配o兩次 ,go{2,3}d :匹配o 2到3次 ,go{2,}d:匹配2次以上

擴展正則表達式元字符

  • :匹配前面子表達式1次以上 如:go+d 將匹配至少一個o
    ?:匹配前面子表達式0次或者1次 如:go?d 將匹配gd或god
    () :將括號中的字符串作為一個整體 如:(xyz)+ 將匹配xyz整體1次以上結果xyzxyz
    | :以或的方式匹配字條 如 :good|food 將匹配good或者food g(oo|la)d 將匹配good或者glad

grep工具

-i :忽略大小寫
-v :取反 分為:過濾出,過濾掉
例如:
grep ‘root’ /etc/passwd //篩選文件中包含root的行
grep -v ‘ root’ /etc/passwd //篩選文件中不包含root的行
grep ‘r..d’ /etc/passwd //篩選r和d之間兩個任意字符的行
grep ‘[^s]bin’ /etc/passwd //篩選bin前面不是以s開頭行
grep ‘^$’ /etc/passwd //篩選出空格白行
grep ‘t[es]’ /etc/passswd //篩選包含te或者ts的行
grep ‘0{1,}’ /etc/passwd //篩選查找數字0出現的次數1次或1次以上
grep -e ‘root’ -e ’sshd’ /etc/passwd //查找root和sshd的行 註:-e參數查找多個模式

grep ‘[^a-z]ae’ /etc/passwd //篩選ae前面不是以小寫字母的行
grep ‘^[a-z]ae’ /etc/passwd //篩選ae前面以小寫字母開頭的行
註:當使用連續的字符時,小寫字母[a-z],大寫字母[A-Z],數字[0-9]
grep ‘0’ /etc/passwd //匹配所有的內容(包括空白行)
註:00
匹配至少包含一個0的行(第一個0必須出現,第二個0可出現0次或多次)

egrep工具

egrep 0+ /etc/passwd //匹配至少包含一個0的行
egrep ‘(root|ntp)’ /etc/passwd //匹配包含root 或者ntp的行
egrep ‘ro?t’ /etc/passwd //匹配rt或者rot的行
egrep -v ‘^$|^#’ /etc/passwd //過濾文件中空白行與#開頭的行。沒有空白行與#號開頭的行,所以沒有如何輸出

sed工具

概述:
sed是文本處理工具,讀取文本內容,根據指定的條件進行處理,如刪除,替換,添加等
可在無交互的情況下實現相當復雜的文本處理操作被廣泛應用於shell腳本,已完成自動化處理任務,sed依賴於正則表達式
命令語法
sed -e ‘編輯指令’ 文件1 文件2 文件 3....... 註:-e ,在’編輯命令’中可有’;’來分割執行命令
sed -n -e ‘編輯命令’ 文件1 文件2... -n 只顯示過濾出內容
sed -i -e ‘編輯命令’ 文件1 文件2.... -i:流編輯器。讀一行處理一行
sed命令格式:
編輯命令格式:[地址1],[地址2]操作[參數]
“地址”,可數字,正則表達式,$ 如果沒有地址代表時所有行
“操作” 可以是 p,d,s,r,w,i等...
“參數” 一般有g ,代表只要符合i傲劍全部進行處理(g全部)
常用操作:
p :輸出指定的行
d :刪除指定的行
s/c :子串替換,格式 :”行範圍 s/舊字符串/新字符串/g”
r :讀取指定條件
w:保存為文件
i :插入,在當前行前面插入一行或多行
輸出指定的行:
sed -n ‘p’ /etc/passwd //將所有內容輸出
sed -n ‘7p’ /etc/passwd //將第7行內容輸出
sed -n ‘$p’ /etc/passwd //將最後一行輸出
sed -n ‘1,7{n;p}’ /etc/passwd //將1~7行的奇數輸出
sed -n ‘1,7{p;n}’ /etc/passwd //將1~7行的偶數輸出
sed -n ‘1,+4p’ /etc/passwd //從第1行,連續4行進行輸出
sed -n ‘/root/p’ /etc/passwd //將匹配包含root的進行輸出
sed -n ‘10,/nom/p’ /etc/passwd //將從第10行至第一個包含nom的行進行輸出
sed -nr ‘/ro{1,}t/p’ /etc/passwd //匹配不少一次前導字符0 ,-r參數支持擴展正則表達式 rot root
sed -n ‘/root|ntp/p’ /etc/passwd //輸出包含root或者ntp的行 註:如果遇到特殊符號,擴展正則需要轉義符 “\”
sed -n ‘/root/=’ /etc/passwd //將包含root所在的行行號輸出, ‘=’用來輸出行號
sed -e ‘5q’ /etc/passwd //輸出前5行信息後退出 ,q 退出
sed -e ‘5p;7p;qp’ /etc/passwd //輸出5行,7行, 9行信息插入符合條件的行
sed ‘/root/i admin:x:490:490::/:/sbin/nologin ’ /etc/passwd //在包含root行的前面一行插入admin:x:490:490::/:/sbin/nologin ’
sed ‘root/a admin:x:490:490::/:/sbin/nologin ’ /etc/passwd //在包含root行的下一行插入admin:x:490:490::/:/sbin/nologin ’
註:sed ‘/root/i’ 前面一行插入 sed ‘/root/a’ 後面一行插入
sed ‘saADMIN’ /etc/passwd //在第3行之後插入ADMIN
刪除符合要求的行:
sed ‘1d’ /etc/passwd //刪除第一行
sed ‘$d’ /etc/passwd //刪除最後一行
sed ‘/^$/d’ /etc/passwd //刪除所有空行
sed ‘2,4d’ /etc/passwd //刪除第2到4行
sed ‘/root/d’ /etc/passwd //刪除包含root的行
sed ‘/root/!d’ /etc/passwd //刪除不包含root的行,這裏的”!”表示取反操作
sed ‘/^root/d’ /etc/passwd //刪除以root開頭的行
sed ‘/nologin$/d’ /etc/passwd //刪除以nologin結尾的行替換符合條件的文本
sed ‘s/root//g’ /etc/passwd //將文件中所有的root都替換成空 g替換全部 s:全部內容
sed -n ‘s/root/admin/2p’ /etc/passwd //把每行的第2個root替換成admin
sed ‘/root/s/root/ROOT/g ’ /etc/passwd //將第1~3行中的所有root都替換為ROOT
sed ‘1,3s/bin/BIN/g’ /etc/passwd //將第1~3行中的所有bin都替換為BIN
sed ‘s/$/ABC/’ /etc/passwd //在每行行尾插入字符串ABC
sed ‘s/^/#/’ /etc/passwd //在每行行首插入#號
sed ‘/root/s /^/#/’ /etc/passwd //將包含root的行的行首插入#號
sed ‘1c ABC ’ /etc/passwd //將第一行替換為ABC
sed ‘y/root/ROOT/’ /etc/passwd //將root對應替換為ROOT y:對應替換
sed ‘/1,10y/root/ROOT’ /etc/passwd //將第1~10行中的root 對應ROOT
遷移符合條件的文本:
sed ‘15,16 w out.txt’ test,txt //另存為
sed ‘5r /etc/reslov.conf ’ test.txt //將/etc/relov.conf 內容讀取到當前文件第5行後面
sed ‘1,5(H:d);$G’ test.txt //將第1~5行內容遷移至末尾 註:H 復制到緩沖區 G 追加到指定行後
sed ‘/^IP/ s/^/#/’ test.txt //在以IP開頭的行的行首插入#
sed ‘1,5H;15,16G’ test.txt
執行多次命令
sed -ne ‘s/root/admin/’ -ne ‘s/bash/sh/p’ /etc/passwd //將root和bash動作替換
sed -ne ‘s/root/admin/;s/bash/sh/p’ /etc/passwd //將root和bash動作提黃
直接修改文件內容:-i 直接修改源文件內容,保存修改的文件
sed -i ‘s/^/#/’ /etc/passwd //在每行開頭插入#號 ,直接修改源文件
DII

awk
awk工具介紹

awk也是一個功能強大的編輯工具,與sed一樣,可在無交互的情況下實現相當復雜的文本操作
命令格式:
awk 選項 ‘模式或條件 {編輯指令}’ 文件1 文件2
> awk -f 腳本文件 文件1 文件2

工作原理:
逐行讀取文本,默認以空格為分隔符進行分隔,將分隔所得的各個字段保存到內建變量中,並按模式或者條件執行編輯命令

awk內置變量
FS:指定每行文本的字段分隔符,缺省為空格或制表位。 註:默認分隔符為空格
NF:當前處理的行的字段個數
NR:當前處理的行的行號(序數)
$0:當前處理的行的整行內容
$n:當前處理行的第n個字段(第n列)

案例:
awk -F: ‘{print $0,NF}‘ /etc/passwd //輸出以冒號為分隔的/etc/passwd文件中記錄的字段段數
df -hT |awk ‘{print $1,$6}‘ //用awk截取命令df -hT輸出的結果,不帶任何條件,進行格式化,打印第1列和第6列數據
awk ‘{print $0}‘ /etc/passwd //輸出所有內容
cat /etc/passwd grep "" /etc/passwd sed -n ‘p‘ /etc/passwd
打印文本內容:
awk ‘NR==1,NR==3{print}‘ bfile //輸出第1至第3行內容
awk ‘NR==1||NR==3{print}‘ bfile //輸出第1行、第3行內容
awk ‘/^root/{print}‘ /etc/passwd //輸出以root開頭的行
awk ‘/nologin$/{print}‘ /etc/passwd //輸出以nologin結尾的行
awk ‘(NR>=1)&&(NR<=3){print}‘ /etc/passwd //輸出第1行到第3行內容
awk "(NR%2)==1{print}‘ /etc/passwd //輸出所有奇數行的內容
awk ‘(NR%2)==0{print}‘ /etc/passwd //輸出所有偶數行的內容
awk -F: ‘!($3<900)‘ /etc/passwd //輸出第3個字段不小於900的行,“!”號表示取反
在使用awk的過程中,可以使用關系運算符作為“條件”,用於比較數字與字符串,運算符大於(>)、小於(<)、小於等於(<=)、等於(==)、不等於(!=)
也可使用邏輯操作符&&,表示“與”,||表示“或”,!表示“非”
還可以進行簡單的數學運算加(+)、減(—)、乘(*)、除(/)、取余(%)、乘方(^)。
只有當條件為真,才執行指定的動作。

awk -F: ‘{if($3>200)print $0}‘ /etc/passwd //輸出第3個字段大於200的行
awk -F: ‘{max=($3>$4)?$3:$4;print max}‘ /etc/passwd
//如果第3個字段的值大於第4個字段的值,則把問號前表達式的值賦給max,否則就將冒號後那個表達式的值賦給max
awk -F: ‘{max=($3>200)?$3:$1;print max}‘ /etc/passwd // //如果第3個字段的值大於200,則把第3個字段的值賦給max,否則就將第1個字段的值賦給max
在使用awk過程中還可以使用條件表達式,條件表達式的運算涉及兩個符號,冒號和問號,其實質就是if...else語句的捷徑,有著if...else相同的結果

接字段輸出文本
awk -F: ‘{print NR,$0}‘ /etc/passwd //輸出處理數據的行號,每處理完一條記錄,NR值加1
awk -F":" ‘$3<5{print $1 $3}‘/etc/passwd //輸出第3列小於5的第1列與第3列數據
awk -F ":" ‘($1~"root")&&(NF==7){print $1,$3}‘/etc/passwd //輸出包含7個字段,並且第1個字段中包含root的行第1與第2字段內容
awk -F":" ‘NR==3,NR==7{print $1,$7}‘ /etc/passwd //輸出第3行到第7行中以冒號為分隔符的第1列與第7列的數據

輸出數據時插入文本標簽:
awk -F: ‘/^root/{print "Hi," $1}‘ /etc/passwd //輸出以冒號為分隔符,以root開頭的行第一列,且在前面插入“Hi,”
awk ‘{print $1"--"$3}‘ 6.txt //輸出第一列和第二列並加入普通字符 引號引用普通字符
awk -F":" ‘$7~"/bash"{print $1}‘ /etc/passwd //輸出冒號分隔且第7個字段中包含/bash的行的第1個字段
awk -F‘:‘‘{print $1":"$2":"$3":"$4}‘ /etc/passwd //保留原來的格式,輸出以冒號為分隔,/etc/passwd文件的前4個字段
awk -F":" ‘{print $1,$3}‘ /etc/passwd //輸出以冒號為分隔符的第1列和第3列
awk ‘BEGIN{FS=":"} {print $1,$3}‘ /etc/passwd //輸出以冒號為分隔符的第1列和第3列
awk ‘BEGIN{X=0};/\/bin\/bash$/{x++};END{printx}‘ /etc/passwd //統計以/bin/bash為結尾的行數

awk執行順序:首先執行BEGIN{}中的操作,然後從指定的文件中逐行讀取數據,自動更新NF、NR、$0、$1等內建變量的值,去s執行‘模式或條件{編輯指令}’;最後執行END{}操作

處理命令輸出的結果:
date |awk ‘{print "Month:"$2"\nYear:"$6}‘ //輸出日期的第2列且在前面插入Month:,換行輸出第6列並在前面插入Year
sort工具
分為:字符排序 ,數字排序
語法格式:
sort [選項] 參數
常用選項
-f :忽略大小寫
-b :忽略每行前面的空格
-M :按照月份進行排序
-n :按照數字進行排序
-r :反向排序
-u :等同於uniq,表示相同的數據僅顯示一行
-t :指定分隔符
-o :<輸出文件> : 將排序後的結果轉存指定文件 如:sort -t”;” /etc/passwd -o user.txt
-k :指定排序區域

uniq工具
用於報告或者忽略文件中的重要行
一般於sort 命令結合使用
語法
uniq [選項] 參數
常用選項
-c :進行計數
-d :僅顯示重復行
-u :僅顯示出現一次的行

Linux 四劍客介紹和案例