簡體   English   中英

如何在awk命令中使用命令的輸出?

[英]How to use output of a command inside an awk command?

我想打印出一個日志文件的最新更新,而不是上面的任何內容(舊日志)。 每5分鍾更新/添加日志一次,沒有選項可以覆蓋而不是追加。 每次更新行的數量現在不改變,但我不希望有改劇本是否以及何時添加了新的領域。 每個附件以“日期:..”開頭。

到目前為止,這是我的解決方案。 我正在查找最后一次出現的“日期”的行號,然后嘗試將其發送到“ awk'NR> line_num_here文件名”-

line=$(grep -n Date stats.log | tail -1 | cut --delimiter=':' --fields=1) | awk "NR>$line" file.log

但是,我無法更新$ line! 從我第一次運行腳本起,它始終擁有第一個值。 有沒有辦法正確更新$ line? 還是有其他方法可以做到這一點? 也許是一種直接將其傳遞給awk而不是進行變量創建的方法?

解決方案中的問題是,您需要用a替換awk前面的管道; 這些是兩個單獨的命令,通常會出現在兩個單獨的行中:

line=$(...)
awk -v "NR>$line" file

但是,您可以將它們分開; 如果應該出現在同一行:

line=$(...); awk -v "NR>$line" file

但是無論如何,您都可以大大簡化命令。 只需兩次使用兩次awk ,如下所示:

awk -v ln="$(awk '/Date/{l=NR}END{print l}' a.log)" 'NR>ln' a.log

我正在使用

awk '/Date/{l=NR}END{print l}' a.log

獲取最后一次出現的Date的行號。 該值通過-v ln=...傳遞給外部awk命令。

這是一種方法,可以通過awk的調用而只讀取一次文件:

awk '/Date/ { n = 1 } { a[n++] = $0 } END { for (i = 1; i < n; ++i) print a[i] }' file

這會將每一行寫入數組a ,每當/Date/模式匹配時,將計數器n重置為1 一旦讀取了文件,它就會遍歷數組,打印所有最近保存的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM