[英]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.