shell中打印出文件匹配行(總數)和匹配的第N行

有時候我們需要兩個文件來記錄已執行過和待執行的記錄,這個時候我們需要找到已執行文件中具有某種特徵的行,以此來確定下一個執行任務,比如:
已執行記錄文件executed_records.txt文件內容
在這裏插入圖片描述
待執行記錄文件execute_records.txt文件內容

當匹配到的待執行任務m大於匹配到的已執行任務n時,即m>n時,執行下一個待執行任務,下一個待執行任務就是待執行任務中匹配到的第n+1條記錄。下面測試以execute_records.txt文件爲例。

1. 打印匹配內容

sed -n -e '/Server-01/p' execute_records.txt

在這裏插入圖片描述

2. 打印匹配內容行號

sed -n -e '/Server-01/=' execute_records.txt

在這裏插入圖片描述

3. 打印出匹配的行號與內容

sed -n ' /Server-01/{= ; p} ' execute_records.txt

在這裏插入圖片描述

4. 打印出匹配結果中的2-4行

sed -n '/Server-01/p' execute_records.txt |sed -n 2,4p

在這裏插入圖片描述

5. 將文件中2到4行中匹配的數據顯示出來

sed -n '/Server-01/{2,4p}' execute_records.txt

在這裏插入圖片描述

6. 打印匹配行總數

方式一:(不推薦)將輸出結果存爲數組,數組長度就是匹配行總數。

array=(`sed -n -e '/Server-01/=' executed_records.txt`)
echo ${#array[@]}

在這裏插入圖片描述
這裏的6其實就是Server-01這臺機器待執行任務記錄爲6,已執行記錄同樣可以通過查詢得到,查詢結果爲4。
這個時候6>4,下一任務就是匹配內容的第五條。利用第3中提到的命令sed -n '/Server-01/p' execute_records.txt |sed -n 4p找到第五條待執行任務的記錄,截取任務文件名20200101.db.000005.sql,將該文件內容寫入數據庫,並記錄該任務到已執行記錄文件中。
方式二:(推薦)用find結果wc -l來統計匹配的行數。

find execute_records.txt -type f -exec grep -H "Server-01" {} \; | wc -l

在這裏插入圖片描述

-type f 表示搜索的是文件 (-type d 則是目錄,具體man find)

-exec <cmd> <args> {} \;   表示對找到的每一個文件名執行  <cmd> <args> ,

注意 {} 會被find替換成找到的文件名, \; 是必須的,用來標記 -exec 的終結

grep -H <Pattern> <FILE>

在 <FILE> 中搜索 <Pattern>, -H 表示在每一個匹配行前打印出文件名

wc -l <FILE> 

統計 <FILE> 中的行數

參考:https://zhidao.baidu.com/question/35794423.html

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