如何使用檔案名稱的一部分作為模式來 grep 多個檔案?

如何使用檔案名稱的一部分作為模式來 grep 多個檔案?

我有一個資料夾,其中包含幾個名為order[ID].logwhere [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}在您的情況下varfilename,偏移量是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

相關內容