第二部分shell編程2正則(grepegrepsedawk)


1、grep/egrep
1. 語法+選項
語法: grep [-cinvABC] 'word' filename
-c :打印符合要求的行數
-n :在輸出符合要求的行的同時連同行號一塊兒輸出
-v :打印不符合要求的行 ,取反===
-A :後跟一個數字(有無空格均可以),例如 –A2則表示打印符合要求的行以及下面兩行
-B :後跟一個數字,例如 –B2 則表示打印符合要求的行以及上面兩行
-C :後跟一個數字,例如 –C2 則表示打印符合要求的行以及上下各兩行
-r : 會把目錄下面全部的文件所有遍歷
-i :不區分大小寫
-o :只過濾符合條件的字段bash

2. 例子介紹
過濾出帶有某個關鍵詞的行並輸出行號 grep -n 'root' 1.txt
過濾出不帶有某個關鍵詞的行並輸出行號grep -n -v 'root' 1.txt
過濾出全部包含數字的行 grep '[0-9]' 1.txt
過濾出全部不包含數字的行 grep -v '[0-9]' 1.txt
去除全部以'#'開頭的行 grep -v '^#' 1.txt ^表示以什麼開頭,就是剩下不以#號開頭的行了ssh

去除全部空行和以'#'開頭的行 grep -v '^$' 1.txt |grep -v '^#' ^$表明以空行開頭,| 而且的意思====工具

過濾出以英文字母開頭的行 grep '^[a-zA-Z]' 1.txtpost

過濾出以非數字開頭的行 grep '^[^0-9]' 1.txt ^0-9表明非數字的意思
去除掉以數字開頭剩下的行 grep -v '^[0-9]' 1.txt spa

=======================================
過濾任意一個或多個字符
grep 'r.o' 1.txt; grep 'r*t' 1.txt; grep'r.*t' 1.txt ci

. 表示任意一個字符;*表示零個或多個前面的字符 ;.*表示零個或多個任意字符,空行也包含在內
=========================================文檔

指定過濾字符次數 grep 'o\{2\}' 1.txt !!!!字符串

grep -E ==egrep
cgrep -E 'r?o' 1.txt E表示能夠用特殊符號?input

cgrep -E 'r?o' 1.txt == cgrep 'o' 1.txt || cgrep 'ro' 1.txt數學

 


grep --color 'root' 1.txt
alias cgrep='grep --color' 也能夠寫在.bashrc裏面 用source .bashrc 重置一下


grep -E ==egrep

3. egrep
egrep工具 是grep工具的擴展
egrep 'o+' 1.txt 表示1個或1個以上前面字符
egrep 'o?' 1.txt 表示0個或者1個前面字符
egrep 'roo|body' 1.txt 匹配roo或者匹配body ======
egrep 'r(oo)|(at)o' 1.txt 用括號表示一個總體
egrep '(oo)+' 1.txt 表示1個或者多個 'oo'

egrep 'sbin' 1.txt |egrep 'post' 而且的意思=======!!!!!!和&&有什麼區別
awk -F ':' '$3>"5" && $3<"7"' 1.txt

egrep 'o{2}' 1.txt 表示篩選o出現幾回的行

4. . * + ? 總結
. 表示任意一個字符(包括特殊字符)
* 表示零個或多個*前面的字符
.* 表示零個或多個任意字符(包含空行)
+ 表示1個或多個+前面的字符
? 表示0個或1個?前面的字符

其中 + ? grep不支持,egrep才支持。
? + () | 這幾個字符才須要脫意 ==========

 


二. sed --- 通常替換和打印行
打印指定行 sed '10'p -n 1.txt; sed '1,4'p -n 1.txt; sed '5,$'p -n 1.txt
n就是把匹配到的p是打印的意思

打印包含某個字符串的行 sed -n '/root/'p 1.txt 可使用 ^ . * $等特殊符號==

-e 能夠實現同時進行多個任務 sed -e '/root/p' -e '/body/p' -n 1.txt 也能夠用;實現 sed '/root/p; /body/p' -n 1.txt

刪除行
sed '/root/d' 1.txt; sed '1d' 1.txt; sed '1,10d' 1.txt
sed -i '/root/d' 1.txt 這裏直接就刪除了文件的東西了


替換 sed '1,2s/ot/to/g' 1.txt, 其中s就是替換的意思,g爲全局替換,不然只替換第一次的,/也能夠爲 #, @ 等
sed 's/BASH/1212/gi' 1.txt i表示不區分大小寫的替換========只在替換的時候用===========
清楚空行,在內容前面和後面添加內容
sed '/^$/d; s/^/AAA/g; s/$/BBB/g' input.txt

 

刪除全部數字 sed 's/[0-9]//g' 1.txt ===
刪除全部非數字sed 's/[^0-9]//g' 1.txt

調換兩個字符串位置 head -n2 1.txt |sed 's/\(root\)\(.*\)\(bash\)/\3\2\1/'

在test.txt 20行到末行最前面加 'aaa:'
sed -r '20,$s#(^.*$)#aaa:\1#g' 1.txt (^.*$)表示一整行,\1表示(^.*$)

直接修改文件內容 sed -i 's/ot/to/g' 1.txt

 

grep -E ;sed -r ; egrep 都表示才能夠用後面的脫意符號

sed練習題:
把/etc/passwd 複製到/root/test.txt,用sed打印全部行
打印test.txt的3到10行 sed 3,10p -n test.txt
打印test.txt 中包含 'root' 的行 sed /root/p -n test.txt
刪除test.txt 的15行以及之後全部行 sed '3,$d' test.txt
刪除test.txt中包含 'bash' 的行 sed '/root/d' test.txt
替換test.txt 中 'root' 爲 'toor' sed 's/root/toor/g' test.txt
替換test.txt中 '/sbin/nologin' 爲 '/bin/login'
sed 's#/sbin/nologin#/bin/login#g' 1.txt

刪除test.txt中5到10行中全部的數字
sed '5,10s#[0-9]##g' 1.txt =======

刪除test.txt 中全部特殊字符(除了數字以及大小寫字母)
sed 's#[^0-9a-zA-Z]##g' 1.txt

==============================================================
把test.txt中第一個單詞和最後一個單詞調換位置
把test.txt中出現的第一個數字和最後一個單詞替換位置
把test.txt 中第一個數字移動到行末尾

==============================================================
在test.txt 20行到末行最前面加 'aaa:'
sed -r '20,$s#(^.*$)#aaa:\1#g' 1.txt (^.*$)表示一整行,\1表示(^.*$)
==================
sed -r '20,$s#(^.*$)#\12#g' 1.txt 從20行開始,在每一行追加2

 

三. awk--- 通常查找指定段的值和匹配,{}裏面的值要print, ‘’不須要print直接能夠運算
截取文檔中的某段 awk -F ':' '{print $1}' 1.txt
awk -F: '{print $1,$2,$3}' 1.txt

也可使用自定義字符鏈接每一個段 awk -F':' '{print $1"#"$2"#"$3"#"$4}' 1.txt
匹配字符或字符串 awk '/oo/' 1.txt
針對某個段匹配 awk -F ':' '$1 ~/oo/' 1.txt ~表明模糊匹配

屢次匹配
awk -F ':' '/root/; $1 ~/aming/; $3 ~/50/' 1.txt
awk -F ':' '/root/ {print $1,$3}; $1 ~/test/; $3 ~/20/' 1.txt

echo -e "1\n10\n100\nx" |sort e表明能夠識別\n ======

條件操做符==, >,<,!=,>=;<=
awk -F ':' '$3=="0"' 1.txt;
awk -F ':' '$3>="500"' 1.txt;
awk -F ':' '$3+0>=500' 1.txt; 強制轉換爲數字
awk -F ':' '$7!="/sbin/nologin"' 1.txt;
awk -F ':' '$3<$4' 1.txt ;
awk -F ':' '$3>"5" && $3<"7"' 1.txt ======
awk -F ':' '$3>"5" || $7=="/bin/bash"' 1.txt

awk內置變量 NF(有幾段) NR(第幾數)
head -n3 1.txt | awk -F ':' '{print NF}'

head -n3 1.txt | awk -F ':' '{print NR}'

打印20行之後的行awk 'NR>20' 1.txt

awk -F ':' 'NR>20 && $1 ~ /ssh/' 1.txt =====

更改某個段的值awk -F ':' '$1="root"' 1.txt ======


數學計算, 把第三段和第四段值相加,並賦予第七段
awk -F ':' '{$7=$3+$4; print $0}' 1.txt ===$0是整行的意思
能夠這樣子寫 awk -F ':' '$7=$3+$4’ 1.txt

計算第三段的總和 awk -F ':' '{(tot=tot+$3)}; END {print tot}' 1.txt

awk中也可使用if關鍵詞 awk -F ':' '{if ($1=="root") print $0}' 1.txt
$0表明總體

用外邊的變量:
a=3; awk -F: '$3="'$a'"' 1.txt ============

awk練習題
用awk 打印整個test.txt (如下操做都是用awk工具實現,針對test.txt)
awk '{print $0}' 1.txt

查找全部包含 'bash' 的行
用 ':' 做爲分隔符,查找第三段等於0的行 awk -F: '$3==0 {print $0}' 1.txt

用 ':' 做爲分隔符,查找第一段爲 'root' 的行,並把該段的 'root' 換成 'toor' (能夠連同sed一塊兒使用)

awk -F: '$1=="root" && $1="toor"' 1.txt ====

awk -F: '$1=="root" && $1="toor"{OFS=":" ;print}' 1.txt OFS是內置的一個變量

用 ':' 做爲分隔符,打印最後一段 !!!!!
awk -F ':' '{print $NF}' 1.txt

打印行數大於20的全部行 awk 'NR>20' 1.txt
用 ':' 做爲分隔符,打印全部第三段小於第四段的行
awk -F ':' '$3<$4' 1.txt
用 ':' 做爲分隔符,打印第一段以及最後一段,而且中間用 '@' 鏈接 (例如,第一行應該是這樣的形式 'root@/bin/bash' )
awk -F: '{print $1"@"$NF}' 1.txt |head -n3
awk -F: '{OFS="@" ;print $1,$7}' 1.txt

用 ':' 做爲分隔符,把整個文檔的第四段相加,求和
awk -F ':' '{(tot=tot+$4)}; END {print tot}' 1.txt

相關文章
相關標籤/搜索