
我需要一些幫助來弄清楚如何使用 sed 命令僅顯示文字檔案中的第一列和最後一列。這是我目前為止第一欄的內容:
cat logfile | sed 's/\|/ /'|awk '{print $1}'
我試著讓最後一欄也顯示出來的無力嘗試是:
cat logfile | sed 's/\|/ /'|awk '{print $1}{print $8}'
然而,這需要第一列和最後一列並將它們合併到一個清單中。有沒有辦法用 sed 和 awk 指令清楚地印出第一列和最後一列?
輸入範例:
foo|dog|cat|mouse|lion|ox|tiger|bar
答案1
差不多了。只需將兩個列引用放在一起即可。
cat logfile | sed 's/|/ /' | awk '{print $1, $8}'
另請注意,這裡不需要cat
。
sed 's/|/ /' logfile | awk '{print $1, $8}'
另請注意,您可以看出awk
列分隔符號是|
, 而不是空格,因此您也不需要sed
。
awk -F '|' '{print $1, $8}' logfile
按照建議經過迦勒,如果您想要一個仍然輸出最後一個欄位的解決方案,即使不正好是八個,您可以使用$NF
。
awk -F '|' '{print $1, $NF}' logfile
此外,如果您希望輸出保留|
分隔符,而不是使用空格,您可以指定輸出欄位分隔符。不幸的是,它比僅僅使用標誌有點笨拙-F
,但這裡有三種方法。
awk
您可以在 BEGIN 區塊中指派輸入和輸出欄位分隔符號本身。awk 'BEGIN {FS = OFS = "|"} {print $1, $8}' logfile
awk
您可以在從命令列呼叫時透過標誌分配這些變數-v
。awk -v 'FS=|' -v 'OFS=|' '{print $1, $8}' logfile
或簡單地:
awk -F '|' '{print $1 "|" $8}' logfile
答案2
awk
無論如何,你正在使用:
awk '{ print $1, $NF }' file
答案3
只需從第一個到最後|
一個替換為|
(或空格,如果您願意):
sed 's/|.*|/|/'
請注意,雖然沒有sed
實現|
(只要擴充-E
正規表示式在某些實作中未啟用-r
),\|
其本身在 GNU 等實作中很特殊sed
。所以你應該不是|
如果您希望它與字元匹配,請轉義|
。
如果用空格替換,並且輸入可能已經包含只有一個的行|
,那麼,您必須特殊對待它,因為|.*|
它們不會匹配。那可能是:
sed 's/|\(.*|\)\{0,1\}/ /'
(即使該部分成為.*|
可選)或:
sed 's/|.*|/ /;s/|/ /'
或者:
sed 's/\([^|]*\).*|/\1 /'
如果您想要第一個和第八個字段,而不管輸入中的字段數量如何,那麼只需:
cut -d'|' -f1,8
(假設輸入形式有效文本,所有這些都可以與任何符合 POSIX 標準的實用程式一起使用(特別是,sed
如果輸入具有在當前語言環境中不形成有效字元的位元組或位元組序列,則這些通常不起作用,例如printf 'unix|St\351phane|Chazelas\n' | sed 's/|.*|/|/'
在UTF-8 語言環境))。
答案4
看來您正在嘗試獲取由 分隔的文字的第一個和最後一個欄位|
。
我假設您的日誌文件包含如下文本,
foo|dog|cat|mouse|lion|ox|tiger|bar
bar|dog|cat|mouse|lion|ox|tiger|foo
你想要的輸出是這樣的
foo bar
bar foo
如果是,那麼這是您的命令
透過 GNU sed,
sed -r 's~^([^|]*).*\|(.*)$~\1 \2~' file
例子:
$ echo 'foo|dog|cat|mouse|lion|ox|tiger|bar' | sed -r 's~^([^|]*).*\|(.*)$~\1 \2~'
foo bar