
所以我必須瀏覽我透過電子郵件發送的日誌(在Windows中),搜尋一行來確定型號序號,我想一個簡單的方法是編寫一個醜陋的批次腳本來轉換.msg,所以我可以讀取文件。例子:
cat "*Pre*.msg" | strings2 > agrep.txt
cat agrep.txt | grep "D24" > a21s.txt
cat a21s.txt | cut -d" " -f7 > Air21Serials.txt
這給我留下了 3 個唯一的數字,我如何將 ALPHA 添加到第 1 行,將 BETA 添加到第 2 行,將 GAMMA 添加到第 3 行,並使用空格或 : 作為分隔符號?
更新:該文件a21s.txt
類似於
0 1 BXP_0 AIR21B4AB2P KRC118046/1 R3B D240090254 20140416
0 1 BXP_1 AIR21B4AB2P KRC118046/1 R3B D240088108 20140414
0 1 BXP_2 AIR21B4AB2P KRC118046/1 R3B D240090208 20140414
答案1
有很多方法可以實現您正在尋找的內容,僅舉幾個例子。
awk
和量身訂製的解決方案
針對您的範例量身定制的解決方案是使用awk
並向其傳遞 3 個變數。它並不通用,因為如果你有 4 行,你就必須傳遞 4 個變量,依此類推...
這個指令有一個簡單的方法來透過列的編號( ,...最後一個) awk
來管理列。$1
$2
$NF
只是為了讓閱讀更簡單,我使用您的舊中間文件
a21s.txt
awk -v s1="ALPHA" -v s2="BETA" -v s3="GAMMA" ' NR==1 {print s1,$7} ; NR==2 {print s2,$7} ; NR==3 {print s3,$7} ; ' a21s.txt
- 在第一行中,您
awk
使用選項傳遞 3 個變數-v
。 - 在下面幾行中,您使用內部變數NR,記錄行數。所以你去印變數s1,只有當你有第一行時,s2與第二個......等等。
- 在後面的最後一行中,
'
您可以指定檔案名,這樣您就不需要呼叫該cat
進程並將其通過管道傳遞給該awk
進程。 - 如果變數(ALPHA,BETA ...)可以透過某種機制產生(例如「Serial01,Serial02」),您可以將其取代行號和外部變數上的控制項。
- 在第一行中,您
實用注意事項:在 *nix 下你可以命令序列Pipeline (
|
) 可以將其輸出到以下內容,無需建立中間檔案。
所以在你的例子中你可以直接使用:cat "*Pre*.msg" | strings2 | grep "D24" | cut -d" " -f7 > Air21Serials.txt
在這種情況下,
cut
您可以使用awk
命令cat "*Pre*.msg" | strings2 | grep "D24" | awk '...' > final_file.txt
.
更通用的解決方案:paste
+awk
假設您的a21s.txt
檔案和另一個檔案 ( b.txt
) 具有相同的行數,並且位於您要新增前綴的字串(每個單字一個單字)內(如下所示)。
ALPHA
BETA
GAMMA
你可以簡單地使用
paste b.txt a21.txt | awk '{print $1,$8}' > Air21Serials.txt
請注意,現在您的序號列位於第 8 列,因為您之前透過貼上新增了另一列。
筆記
man awk
使用和向 Linux 本身詢問更多信息man paste
:-)
答案2
迴聲阿爾法>agrep.txt;貓 ”預.msg" | 字串2>>agrep.txt
這可能不是確切的路線..這個概念是,你第一的想要將單字“Alpha”放入文件中..使用 > 符號建立文件,並使用 >> 附加到文件。如果沒有“換行符”,它應該在其中放置單字 ALPHA,然後附加第一條訊息。
您可能需要稍微嘗試一下才能使程式碼正常運作。
編輯:搜尋發現使用貓和列印函數是比 echo 更好的選擇,因為 echo 可能會因作業系統而異
例如: cat ("ALPHA: ") > agrep.txt ;貓 ”預.msg" | 字串2>>agrep.txt
為了執行“one liner”命令,第一個管道應該是 ;或 &&
;中間指令總是執行下一個指令 && 僅當前一個指令成功且 || 之間的指令才執行下一個指令(雙管道)僅當上一個指令失敗時才執行下一個指令
答案3
我不確定strings2
你的輸入是什麼,所以我不能 100% 確定這會按預期工作。但也許它至少會為你指引正確的方向。cat
可以接受來自標準輸入的輸入。所以,你也可以這樣做
echo ALPHA: | cat - "*Pre*.msg" | strings2 > agrep.txt
echo BETA: | cat - agrep.txt | grep "D24" > a21s.txt
echo GAMMA: | cat - a21s.txt | cut -d" " -f7 > Air21Serials.txt