Linux sed命令,awk命令【基本用法以及shell編程】

grep 、sed、awk被稱爲linux中的"三劍客"。
總結一下這三個"劍客"的特長。
grep 更適合單純的查找或匹配文本
sed 更適合編輯匹配到的文本
awk 更適合格式化文本,對文本進行較複雜格式處理
參考:awk從放棄到入門(1):awk基礎 (通俗易懂,快進來看)

(一)sed命令 基本用法

已知quote.txt文件內容如下:

The honeysuckle band played all night long for only $90.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:10.
The local nurse Miss P.Neave was in attendance. 

試編寫sed命令實現如下功能。(按模式串替換/按行替換、追加、刪除、查找)

(1)刪除$符號。

cat -n quote.txt | sed 's/\$//g'

運行結果:
在這裏插入圖片描述
(2)顯示包含music文字的行內容及行號。

cat -n quote.txt | sed -n '/music/p'

運行結果:
在這裏插入圖片描述
(3)在第4行後面追加文件“hello world!”。

cat -n quote.txt | sed '4a hello world'

運行結果:
在這裏插入圖片描述
(4)將文本中的所有“The”都修改爲“Ok”。

cat -n quote.txt | sed 's/The/Ok/g'

運行結果:
在這裏插入圖片描述
(5)將第3行內容替換爲“This is the third line.”。

cat -n quote.txt | sed '3c This is the third line.'

運行結果:
在這裏插入圖片描述
(6)刪除第2行內容。

cat -n quote.txt | sed '2d'

運行結果:
在這裏插入圖片描述
(7)設置shell變量var的值爲evening,用sed命令查找匹配var變量值的行。

var=evening
echo $var
cat -n quote.txt | sed -n "/$var/p"

運行結果:
在這裏插入圖片描述
注意,"/$var/p"必須是雙引號!如果是單引號則$var將被認爲是字符串“$var”
只要沒有用變量,雙引號改成單引號沒有關係,結果是一樣的,但是用了變量就必須是雙引號!

(8)-i,修改原文件,並且顯示出單引號和雙引號的區別。

sed -i '4a $var' quote.txt  # 在文件第4行末尾添加字符串"$var",並且修改原文件
cat -n quote.txt
sed -i "4a $var" quote.txt  # 在文件第4行末尾添加變量var的內容,並且修改原文件
cat -n quote.txt

運行結果:
在這裏插入圖片描述

(二)awk命令 基本用法

awk [options] ‘program’ file1, file2, …
對於上述語法中的program來說,又可以細分成pattern和action,也就是說,awk的基本語法如下:
awk [options] ‘Pattern{Action}’ file

事先準備awk_test.txt和data.txt。

awk_test.txt文件內容如下(每個冒號前後都有空格):

one : two : three
four : five : six

data.txt文件內容如下:

1 2 3
4 5
6 7 8 9

(1)空格做分隔符,顯示文件第2列的內容。

awk 'BEGIN{FS=" "}{print $2}' awk_test.txt

運行結果:
在這裏插入圖片描述
(2)冒號做分隔符,顯示文件第2列的內容。

awk 'BEGIN{FS=":"}{print $2}' awk_test.txt

加上BEGIN是爲了使得第一行也按冒號做分隔符,否則第一行會默認按空格做分隔符。

運行結果:
在這裏插入圖片描述
(3)循環打印出文件中所有的字段。

①遍歷所有字段

awk '{for(i=1;i<=NF;i++)print $i}' data.txt

NF表示字段數。
看awk單引號中的代碼,是不是很像C語言?for就像C語言的循環,括號括起來就像代碼塊(在awk中的術語中被稱作“Action”)。

運行結果:
在這裏插入圖片描述
②遍歷前兩行所有字段

awk '{for(i=1;i<=NF;i++)if(NR<=2)print $i}' data.txt

NR表示行數。 if語法、for語法和C語言相同,print語法不同。

運行結果:
在這裏插入圖片描述
③遍歷前兩行所有字段,並同時加上一個數x

awk '{x=10}{for(i=1;i<=NF;i++)if(NR<=2)print $i+x}' data.txt

運行結果:
在這裏插入圖片描述
(4)已知文件data.txt中都是數字,數字之間以空格作爲分隔符,試將data.txt裏的所有偶數輸出,並輸出偶數的個數。要求判斷每個數字是否爲偶數,即要求程序裏包含循環和分支結構。

awk '{for(i=1;i<=NF;i++)if($i%2==0){print $i;sum++}}END{print "sum="sum}' data.txt

注意:END表示處理完所有行之後需要執行的操作;print sum的時候sum不能加$。

運行結果:
在這裏插入圖片描述

AWK 包含兩種特殊的模式:BEGIN 和 END。
BEGIN 模式指定了處理文本之前需要執行的操作。
END 模式指定了處理完所有行之後需要執行的操作。

(三)利用awk命令 編寫shell腳本

已知腳本awk.sh的內容如下,試通過運行該腳本,理解該腳本實現的功能。(事先準備好quote.txt)

#!/bin/bash
read -p "enter search pattern: " pattern
awk "/$pattern/"'{ nmatches++; print } END { print nmatches " found." }' quote.txt

功能:輸入要匹配的模式串,程序返回模式串所在行的內容以及出現的次數。

模式串爲"The":
在這裏插入圖片描述
模式串爲"a":
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章