
我有一個資料夾,其中包含幾個名為order[ID].log
where [ID]
is a string 例如的文件
orderID1.log
orderID2.log
orderID3.log
orderID4.log
...
我需要在 Linux 中按檔案名稱中的 向grep
每個檔案寫入一個腳本ID
,並將結果輸出到名為ID.log
範例的檔案中:
For orderID1.log
,我需要grep 'ID1' orderID1.log > ID1.log
For orderID2.log
,我需要grep 'ID2' orderID2.log > ID2.log
我嘗試編寫下面的腳本,
for i in ORDER*.log
do
grep 'i' order$i > $i.log;
done
這裡的問題是我將被記錄為“orderID1”,“orderID2”而不是“ID1”,“ID2”。在linux下有沒有簡單的方法可以做到這一點?
答案1
您必須ID
從檔案名稱中提取子字串。一種方法是透過參數擴展,例如${var:offset:length}
在您的情況下var
是f
ilename,偏移量是5
( order
) ,長度是${#f}-9
(即總長度${#f}
減去 和 的組合長度order
,.log
其中是9
字元):
for f in order*.log
do
ID=${f:5:${#f}-9}
grep -- "$ID" "$f" > "$ID".log
done
或者如果您更喜歡單行:
for f in order*.log; do ID=${f:5:${#f}-9}; grep -- "$ID" "$f" >" $ID".log; done
或者,您可以使用awk
申請對多個文件執行相同的操作:
awk '
FNR==1{
if(fname)close(fname)
id=substr(FILENAME, 6, length(FILENAME)-9)
fname=id".log"
}
$0 ~ id{
print > fname
}
' order*.log
這只需一次awk
呼叫即可完成所有文件,從而避免了 shell 循環。一行:
awk 'FNR==1{if(f)close(f);id=substr(FILENAME, 6, length(FILENAME)-9);f=id".log"} $0~id{print > f}' order*.log