回覆列表
-
1 # FungLeo
-
2 # 產品經理老胡
想要在Linux中批次提取一批檔案中的某一行資料,我的思路是把問題分解:
遍歷這批檔案
提取某一行資料(根據模式匹配或者固定行號)
將資料輸出到某處
可以採用shell程式設計的方式來完成這個任務:
批次檔案遍歷批次檔案遍歷有兩個辦法實現,如果知道檔案的列表,就可以按照檔案的列表來遍歷,例如:
其中file001、file002、file003是你這一批檔案的路徑+檔名。
如果這些檔案都放在了一個目錄foo下面,也可以寫成這個樣子:
從檔案中提取某一行資料根據關鍵詞匹配提取
比如當且僅當關鍵詞“bar”在這批檔案中的每一個檔案僅出現一次,我們就可以根據這個關鍵詞定位它所在的行,並輸出這一行:
grep "bar" filename
寫到迴圈中就是:
根據行號匹配提取
使用sed命令可以根據固定的行號提取檔案中該行的內容,比如固定提取每個檔案的第30行:
sed -n "30p" filename
寫到迴圈中就是:
將資料輸出到某處最後將查詢的內容使用重定向“>>”輸出到文字檔案中。完整的指令碼大約是這樣的:
總結一下,類似稍微複雜的檔案操作首先想到的是將問題分解,針對每個小問題找出解決的方案。另外此例中如果檔案都在一個目錄內的情況下,並且採用的是關鍵詞匹配提取,則可以直接使用grep語句一次性搞定:
grep “key_word” /foo/*
這樣做的缺點是輸出的資訊帶有檔名,需要進一步處理,這裡就不詳解了。
ls 得到檔案列表。然後迴圈讀取檔案。用head擷取第零行到指定行之間的文字。最後用tail讀取最後一行。
程式碼如下:
#!/bin/bash
files=$(ls)
for i in $files; do
head -n20 $i | tail -n1
done
如果希望將結果輸出到某個檔案的話,還可以這樣改
#!/bin/bash
files=$(ls)
for i in $files; do
res=$(head -n20 $i | tail -n1)
echo $res > res.txt
done
然後就會把所有的結果都儲存在 res.txt 檔案中了。