AWK - 列印最後一列以及空值

AWK - 列印最後一列以及空值

$NF如果我們不知道最後一列號,我們可以使用列印文件中每一行的最後一列。

但我面臨的困難是最後一列有空值。

例如,解析who命令

$ who
root     tty1         2018-01-25 09:36
root     pts/0        2018-05-30 07:39 (192.168.1.134)
root     pts/1        2018-05-28 23:12 (192.168.1.134)
root     pts/2        2018-06-01 10:01 (192.168.1.188)

得到結果:

$ who | awk '{print $NF}'
09:36
(192.168.1.134)
(192.168.1.134)
(192.168.1.188)

預期結果

(192.168.1.134)
(192.168.1.134)
(192.168.1.188)

讓我知道在一句台詞中獲得預期結果的可能性。

編輯1:上述場景僅是一個範例。我不喜歡更改分隔符號來實現結果。

編輯2:欄位少於最大值的行中沒有任何內容(輸出的空白行)

答案1

要僅輸出具有最大列數的行的最後一列,您可以執行以下操作:

who | awk '
  NF > max  {max = NF; output = ""}
  NF == max {output = output $NF ORS}
  END       {printf "%s", output}'

為每一行輸入輸出一行,但對於沒有最大列數的行為空:

who | awk '
  NF > max {max = NF}
  {n[NR] = NF}
  NF == max {last[NR] = $NF}
  END {for (i = 1; i <= NR; i++) print n[i] == max ? last[i] : ""}'

答案2

如果您只想從具有最多字段的行中獲取最後一個字段,則需要讀取資料兩次:一次找出最大數量的字段,另一次列印字段。只讀一次並不能解決問題:任何行都可能比之前有更多的字段,而且沒有辦法知道。

使用awk(注意檔名給出兩次):

awk -vfields=0 'FNR==NR {if (NF > fields) fields=NF; next} 
     NF >= fields { print $NF } NF < fields {print ""}' file file

如果file包含

foo bar
one two three four
1 2 3
a b c d

這將列印第四個字段,或者對於沒有它的行為空:



d

當然,這不適用於管道,您必須使用臨時文件。

另一種解決方案可以快取要列印的字段,直到出現包含更多字段的行,如下所示史蒂芬的回答

答案3

檢查第 5 個欄位是否匹配\(.*\),如果匹配則列印。

who | awk '$5 ~ /\(.*\)/{print $5}'

如果您只對地址感興趣,ip請更改正規表示式:

who |  awk '$5 ~ /\((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\)/{print $5}'

答案4

如果您只想在該列可用的情況下獲取最後一列,請使用您所選的行這一事實想要只有四列:

who | awk 'NF > 4 { print $NF }'

或者,為了獲得類似的數據,

w -hi | awk '{ print $3 }'

相關內容