sed awk 編輯器

sarynsuo發表於2021-01-03

sed編輯器

sed是一種流編輯器,流編輯器會在編輯器處理資料之前基於預先提供的一組規則來編輯資料流。
sed編輯器可以根據命令來處理資料流中的資料,這些命令要麼從命令列中輸入,要麼儲存在一個命令文字檔案中。

sed 的工作流程主要包括讀取、執行和顯示三個過程:

•讀取:sed 從輸入流(檔案、管道、標準輸入)中讀取一行內容並儲存到臨時的緩衝區中(又稱模式空間,pattern space)。
•執行:預設情況下,所有的sed 命令都在模式空間中順序地執行,除非指定了行的地址,否則sed 命令 將會在所有的行上依次執行。
•顯示:傳送修改後的內容到輸出流。在傳送資料後,模式空間將會被清空。在所有的檔案內容都被處理完成之前,上述過程將重複執行,直至所有內容被處理完。

在所有的檔案內容都被處理完成之前,上述過程將重複執行,直至所有內容被處理完。
注意:預設情況下所有的sed命令都是在模式空間內執行的,因此輸入的檔案並不會發生任何變化,除非是用重定向儲存輸出。

命令格式:

sed -e '操作' 檔案1 檔案2 ...
sed -n -e '操作' 檔案1 檔案2 ...
sed -f 指令碼檔案 檔案1 檔案2 ...
sed -i -e '操作' 檔案1 檔案2 ...

sed -e 'n{
操作1
操作2
...
}' 檔案1 檔案2 ...

常用選項:

-f 或--file=:表示用指定的指令碼檔案來處理輸入的文字檔案。
-h 或--help:顯示幫助。
-n、--quiet 或 silent:禁止sed編輯器輸出,但可以與p命令一起使用完成輸出。
-i:直接修改目標文字檔案。

常用操作:

d:刪除,刪除選定的行。
a:增加,在當前行下面增加一行指定內容。
i:插入,在選定行上面插入一行指定內容。
c:替換,將選定行替換為指定內容。
y:字元轉換,轉換前後的字元長度必須相同。
p:列印,如果同時指定行,表示列印指定行;如果不指定行,則表示列印所有內容;如果有非列印字元,則以 ASCII 碼輸出。其通常與“-n”選項一起使用。
=:列印行號。
l(小寫L):列印資料流中的文字和不可列印的ASCII字元(比如結束符$、製表符\t)

列印內容:


sed -n -e '=' testfile1

sed -n -e 'l' testfile1

sed -n -e '=;p' testfile1
sed -n -e '=' -e 'p' testfile1

sed -n '
> =
> p
> ' testfile1

使用地址:

sed編輯器有2種定址方式:
1、以數字形式表示行區間
2、用文字模式來過濾出行

sed -n '1p' testfile2

sed -n '$p' testfile2

sed -n '1,3p' testfile2

sed -n '3,$p' testfile2

sed -n '1,+3p' testfile2	#列印1之後的連續3行,即1-4行

sed '5q' testfile2			#列印前5行資訊後退出,q表示退出

sed -n 'p;n' testfile2		#列印奇數行;n表示移動到下一行

sed -n 'n;p' testfile2		#列印偶數行

sed -n '2,${n;p}' testfile2

sed -n '/ftp/p' /etc/passwd

sed -n '/^a'/p  /etc/passwd

sed -n '/bash$'/p  /etc/passwd

sed -n '/ftp\|root/p' /etc/passwd

sed -n '2,/145/p' testfile2

sed -n '/145/=' testfile2

sed -nr '/ro{1,}t/p' /etc/passwd	#-r表示支援正規表示式

刪除行:

sed 'd' testfile2			#全刪

sed '3d' testfile2

sed '2,4d' testfile2

sed '$d' testfile2

sed '/^$/d' testfile2		#刪除空行

sed '/bash$/d' /etc/passwd

sed '/nologin$/!d' /etc/passwd		#“!”表示取反操作

sed '/2/,/3/d' testfile2		#從第一個位置開啟行刪除功能,到第二個位置關閉行刪除功能
sed '/1/,/3/d' testfile2

替換:

行範圍 s/舊字串/新字串/替換標記

4種替換標記:
數字:表明新字串將替換第幾處匹配的地方
g:表明新字串將會替換所有匹配的地方
p:列印與替換命令匹配的行,與-n一起使用
w 檔案:將替換的結果寫到檔案中

sed -n 's/root/admin/p' /etc/passwd

sed -n 's/root/admin/2p' /etc/passwd

sed -n 's/root/admin/gp' /etc/passwd

sed 's/root//g' /etc/passwd

sed '1,20 s/^/#/' /etc/passwd

sed '/^root/ s/$/#/' /etc/passwd

sed -f script.sed testfile2

sed '1,20w out.txt' /etc/passwd
sed '1,20 s/^/#/w out.txt' /etc/passwd

sed -n 's/\/bin\/bash/\/bin\/csh/p' /etc/passwd
sed -n 's!/bin/bash!/bin/csh!p' /etc/passwd		#使用“!”作為字串分隔符

插入:

sed '/45/c ABC' testfile2

sed '/45/ y/45/AB/' testfile2

sed '1,3a ABC' testfile2

sed '1i ABC' testfile2

sed '5r /etc/resolv.conf' testfile2

sed '/root/{H;d};$G' /etc/passwd	#將包含root的行剪下到末尾,H表示複製到剪下板,G表示貼上到指定行後

sed '1,5H;15,16G' /etc/passwd



awk

工作原理:

逐行讀取文字,預設以空格或tab鍵為分隔符進行分隔,將分隔所得的各個欄位儲存到內建變數中,並按模式或者條件執行編輯命令。
sed命令常用於一整行的處理,而awk比較傾向於將一行分成多個“欄位”然後再進行處理。awk資訊的讀入也是逐行讀取的,執行結果可以通過print的功能將欄位資料列印顯示。在使用awk命令的過程中,可以使用邏輯操作符“&&”表示“與”、“||”表示“或”、“!”表示“非”;還可以進行簡單的數學運算,如+、-、*、/、%、^分別表示加、減、乘、除、取餘和乘方。

命令格式:

awk 選項 '模式或條件 {操作}' 檔案 1 檔案 2 …
awk -f 指令碼檔案 檔案 1 檔案 2 …
awk常見的內建變數(可直接用)如下所示:
FS:列分割符。指定每行文字的欄位分隔符,預設為空格或製表位。與"-F"作用相同
NF:當前處理的行的欄位個數。
NR:當前處理的行的行號(序數)。
$0:當前處理的行的整行內容。
$n:當前處理行的第n個欄位(第n列)。
FILENAME:被處理的檔名。
RS:行分隔符。awk從檔案上讀取資料時,將根據RS的定義把資料切割成許多條記錄,而awk一次僅讀入一條記錄,以進行處理。預設值是'\n'

按行輸出文字:
awk '{print}' testfile2 				#輸出所有內容
awk '{print $0}' testfile2 				#輸出所有內容

awk 'NR==1,NR==3{print}' testfile2		#輸出第 1~3 行內容
awk '(NR>=1)&&(NR<=3){print}' testfile2	#輸出第 1~3 行內容

awk 'NR==1||NR==3{print}' testfile2		#輸出第1行、第3行內容

awk '(NR%2)==1{print}' testfile2 		#輸出所有奇數行的內容
awk '(NR%2)==0{print}' testfile2		#輸出所有偶數行的內容

awk '/^root/{print}' /etc/passwd		#輸出以 root 開頭的行

awk '/nologin$/{print}' /etc/passwd		#輸出以 nologin 結尾的行

awk 'BEGIN {x=0};/\/bin\/bash$/{x++};END {print x}' /etc/passwd		#統計以/bin/bash 結尾的行數,等同於 grep -c "/bin/bash$" /etc/passwd
BEGIN模式表示,在處理指定的文字之前,需要先執行BEGIN模式中指定的動作;awk再處理指定的文字,之後再執行END模式中指定的動作,END{}語句塊中,往往會放入列印結果等語句

按欄位輸出文字:


awk -F ":" '{print $1,$3}' /etc/passwd		#輸出每行中的第1、3個欄位

awk -F ":" '$3<5{print $1,$3}' /etc/passwd	#輸出第3個欄位的值小於5的第1、3個欄位內容

awk -F ":" '!($3<200){print}' /etc/passwd 	#輸出第3個欄位的值不小於200的行
awk 'BEGIN {FS=":"};{if($3>=200){print}}' /etc/passwd	#先處理完BEGIN的內容,再列印文字里面的內容

awk -F ":" '{max=($3>$4)?$3:$4;{print max}}' /etc/passwd		#($3>$4)?$3:$4三元運算子,如果第3個欄位的值大於第4個欄位的值,則把第3個欄位的值賦給max,否則第4個欄位的值賦給max

awk -F ":" '{print NR,$0}' /etc/passwd		#輸出每行內容和行號,每處理完一條記錄,NR值加1

awk -F ":" '$7~"/bash"{print $1}' /etc/passwd	#輸出以冒號分隔且第7個欄位中包含/bash的行的第1個欄位

awk -F ":" '($1~"root")&&(NF==7){print $1,$2}' /etc/passwd	#輸出第1個欄位中包含root且有7個欄位的行的第1、2個欄位

awk -F ":" '($7!="/bin/bash")&&($7!="/sbin/nologin"){print}' /etc/passwd	#輸出第7個欄位既不為/bin/bash,也不為/sbin/nologin的所有行

通過管道、雙引號呼叫 Shell 命令:


awk -F: '/bash$/{print | "wc -l"}' /etc/passwd		#呼叫 wc -l 命令統計使用 bash 的使用者個數,等同於 grep -c "bash$" /etc/passwd

free -m | awk '/Mem:/ {print int($3/($3+$4)*100)}'	#檢視當前記憶體使用百分比

top -b -n 1 | grep Cpu | awk -F ',' '{print $4}' | awk '{print $1}'		#檢視當前CPU空閒率,(-b -n 1 表示只需要1次的輸出結果)

date -d "$(awk -F "." '{print $1}' /proc/uptime) second ago" +"%F %H:%M:%S"		#顯示上次系統重啟時間,等同於uptime;second ago為顯示多少秒前的時間,+"%F %H:%M:%S"等同於+"%Y-%m-%d %H:%M:%S"的時間格式


awk 'BEGIN {while ("w" | getline) n++ ; {print n-2}"%"}'	#呼叫w命令,並用來統計線上使用者數

awk 'BEGIN {"hostname" | getline ; {print $0}}'			#呼叫 hostname,並輸出當前的主機名

當getline左右無重定向符“<”或“|”時,getline作用於當前檔案,讀入當前檔案的第一行給其後跟的變數var或$0;應該注意到,由於awk在處理getline之前已經讀入了一行,所以getline得到的返回結果是隔行的。
當getline左右有重定向符“<”或“|”時,getline則作用於定向輸入檔案,由於該檔案是剛開啟,並沒有被awk讀入一行,只是getline讀入,那麼getline返回的是該檔案的第一行,而不是隔行。

CPU使用率
cpu_us=top -b -n 1 | grep Cpu | awk '{print $2}'
cpu_sy=top -b -n 1 | grep Cpu | awk -F ',' '{print $2}' | awk '{print $1}'
cpu_sum= ( ( (( ((cpu_us+$cpu_sy))
echo $cpu_sum

相關文章