我有一個試圖通過 awk 過濾的檔案資料,我能夠過濾資料,但希望 awk 陳述句更簡單地合并為一行:
檔案內容:
Entity Name
Value
Unknown dbs636294051.klm.bet.com: /opt
N/A
Unknown dbs636294051.klm.bet.com: /tmp
N/A
Unknown dbs636294051.klm.bet.com: /var
N/A
我的審判:
awk '!/^N/{ if($2 ~ /klm/) print $2}' file | awk -F":" '{print $1}'
以上作業,但我正在尋找這是否可以修剪到之前的管道:
dbs636294051.klm.bet.com
dbs636294051.klm.bet.com
dbs636294051.klm.bet.com
uj5u.com熱心網友回復:
該sub函式可用于修剪冒號及其后的任何內容$2:
awk '!/^N/ && $2 ~ /klm/ {sub(/:.*$/,"",$2); print $2}' file
uj5u.com熱心網友回復:
您可以撰寫一個 awk 命令,將欄位分隔符設定為 1 個或多個空格,或者:,檢查欄位 1 是否不以N它包含的 ad開頭klm
具體來說,你也可以寫 ^N\/A$
得益于@評論雷諾Pacalet和@ Wiktor的Stribi?ew命令可以是這樣的:
awk -F'[[:blank:]] |:' '!/^N/ && $2 ~ /klm/{print $2}' file
在零件中
awk -F'[[:blank:]] |:' ' # Set the field separator to either 1 spaces or tabs or a semicolon
!/^N/ && $2 ~ /klm/ # If the record does not start with `N` and field 2 does contain klm
{print $2} # Print the second column
輸出
dbs636294051.klm.bet.com
dbs636294051.klm.bet.com
dbs636294051.klm.bet.com
uj5u.com熱心網友回復:
這是一個快速而骯臟的方法,適用于給定的示例。如果您有更多過濾規則,也很容易調整。
awk -F'[:\\s]' 'NR>1 && $2~/klm/{print $2}' f
636294051.klm.bet.com
636294051.klm.bet.com
636294051.klm.bet.com
更新,另一種方法:
awk '$2~/klm/ && (($0=$2) sub(/:.*/,""))' f
uj5u.com熱心網友回復:
awk '/Unknown/{gsub(/:/,"",$0);print $2}' 檔案
uj5u.com熱心網友回復:
當您有兩個awk帶有不同欄位分隔符的管道命令時,例如
awk '!/^N/{ if($2 ~ /klm/) print $2}' file | awk -F":" '{print $1}'
在這種情況下,您可以使用split函式將其轉換為單個awk命令
awk '!/^N/{ if($2 ~ /klm/){split($2,arr,":");print arr[1]}}' file
免責宣告:此答案僅適用于將 2 awks更改為單個,其他改善方法不在此答案范圍內。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/367454.html
