簡體   English   中英

擊。 awk最后一列有可能的空格

[英]Bash. awk last column with possible spaces

我有一個動態輸出。 有時這樣:

F8:XX:94:XX:C2:XX    1    39%     No    ANY_NAME
A2:XX:34:XX:E8:XX    6    42%     Yes    ANY_OTHER_NAME
D1:XX:78:XX:A1:XX    6    24%     No    MORESTUFF

或者像其他時間一樣:

F8:XX:94:XX:C2:XX    1    433     39%     No    ANY NAME
A2:XX:34:XX:E8:XX    6    232     42%     No    ANY_OTHER_NAME
D1:XX:78:XX:A1:XX    6    112     22%     Yes    MORE STUFF

正如您所看到的那樣,最后一列是我想要的,但它可以包含空格或不包含空格,列數是動態的。

我需要在沒有空格或有多個空格的情況下始終捕獲最后一列的值。 有時,列號也是動態的,但我想要的數據總是在最后一個有空格的位置。 此數據之前的列始終為“是”或“否”(不確定這是否有幫助)。

有沒有辦法用awk做到這一點? 這就是我的實際情況:

myvar=$(echo "${line}" | awk '{print $NF}')

但是這只是在空間之后的最后一部分,而不是完整的數據。 所以這只有在數據沒有空格時才有用。

我想要的是在包含它們的情況下始終獲得包含空格的最后數據。 有幫助嗎?

如果您確定您關心的數據永遠不會有多個空格的運行,那么請將其用作字段分隔符。

awk -F '\t| {2,}' ...

使用GNU awk for \\s\\S速記:

$ awk '{sub(/[^%]+%\s+\S+\s+/,"")}1' file
ANY_NAME
ANY_OTHER_NAME
MORESTUFF
ANY NAME
ANY_OTHER_NAME
MORE STUFF
oh   No     lots of    spaces

有任何awk:

$ awk '{sub(/[^%]+%[[:space:]]+[^[:space:]]+[[:space:]]+/,"")}1' file
ANY_NAME
ANY_OTHER_NAME
MORESTUFF
ANY NAME
ANY_OTHER_NAME
MORE STUFF
oh   No     lots of    spaces

或者任何支持-E用於ERE的sed(例如GNU或OSX / BSD seds):

$ sed -E 's/[^%]+%[[:space:]]+[^[:space:]]+[[:space:]]+//' file
ANY_NAME
ANY_OTHER_NAME
MORESTUFF
ANY NAME
ANY_OTHER_NAME
MORE STUFF
oh   No     lots of    spaces

以上內容在此輸入文件上運行:

$ cat file
F8:XX:94:XX:C2:XX    1    39%     No    ANY_NAME
A2:XX:34:XX:E8:XX    6    42%     Yes    ANY_OTHER_NAME
D1:XX:78:XX:A1:XX    6    24%     No    MORESTUFF
F8:XX:94:XX:C2:XX    1    433     39%     No    ANY NAME
A2:XX:34:XX:E8:XX    6    232     42%     No    ANY_OTHER_NAME
D1:XX:78:XX:A1:XX    6    112     22%     Yes    MORE STUFF
D1:XX:78:XX:A1:XX    6    112     22%     Yes    oh   No     lots of    spaces

你的評論,這是第一個處理輸入文件內容的腳本,從管道一次傳遞給它1行:

$ while IFS= read -r line; do
    echo "$line" | awk '{sub(/[^%]+%\s+\S+\s+/,"")}1'
done < file
ANY_NAME
ANY_OTHER_NAME
MORESTUFF
ANY NAME
ANY_OTHER_NAME
MORE STUFF
oh   No     lots of    spaces

所有其他腳本的使用方式完全相同。

你可以嘗試這個awk:

awk '{sub(/.*(Yes|No)[[:blank:]]*/,"")}1' infile

暫無
暫無

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

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