如你所知,如果last
輸出有一個!
中,腳本會分割該字符上的輸入行。
last
的輸出格式不是標準化的(例如不在POSIX中),但是您不太可能找到第一列包含除啓動操作的名稱之外的任何內容的任何系統。舉例來說,我看到:
tom pts/8 Wed Apr 27 04:25 still logged in michener.jexium-island.net
tom pts/0 Wed Apr 27 04:15 still logged in michener.jexium-island.net
reboot system boot Wed Apr 27 04:02 - 04:35 (00:33) 3.2.0-4-amd64
tom pts/0 Tue Apr 26 16:23 - down (04:56) michener.jexium-island.net
繼續
reboot system boot Fri Apr 1 15:54 - 19:03 (03:09) 3.2.0-4-amd64
tom pts/0 Fri Apr 1 04:34 - down (00:54) michener.jexium-island.net
wtmp begins Fri Apr 1 04:34:26 2016
與Linux和不同日期的格式,起源等,在其他機器上。
通過設置IFS=!
,腳本場分離器設置爲一個值,該值是不可能在last
輸出發生,所以每行被讀入LINE
而不分裂它。通常情況下,線條在空間上分開。
但是,如您所見,last
的輸出通常使用空格分隔列,並將其輸入到awk
中,該列將—與空格分開。該腳本可以以各種方式被簡化,e.g,:
#!/bin/sh
for LINE in $(last -a | sed -e '$ d' -e 's/ .*//')
do
echo $LINE
done
這是適當的(從問題的例子開始),如果登錄的次數不夠大到超出你的命令行。在檢查last
輸出的變化時,我注意到一臺機器從幾年開始有大約9800行。 (在這種情況下,其他通常不使用for循環的動機是不合理的)。作爲管:
#!/bin/sh
last -a | sed -e 's/ .*//' -e '/^$/d' | while IFS= read LINE
do
echo $LINE
done
我改變了SED表達(其可能OP從一些地方如Bash - remove the last line from a file複製),因爲它不起作用。
最後,使用-a
選項last
是不必要的,因爲它提供的所有附加信息都被丟棄。
您可以有可能與去年'-a取代所有代碼| AWK 'NF> 8 {打印$ 1}'' – John1024