重击awk最后一列,可能有空格

时间:2018-07-29 17:49:04

标签: bash awk

我有一个动态输出。有时这样:

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}')

但是,这仅占空格之后的最后一部分,而不是完整的数据。因此,这仅在数据没有空格的情况下有效。

我想要的是在包含它们的情况下始终获取最后的数据及其空格。有帮助吗?

3 个答案:

答案 0 :(得分:4)

如果您确定所关心的数据永远不会有一个以上的空格,那么请使用它作为字段分隔符。

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

答案 1 :(得分:2)

使用GNU awk作为\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

或与任何支持ERE的-E的sed(例如GNU或OSX / BSD sed):

$ 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

写下您的评论,这是第一个处理输入文件内容的脚本,该脚本一次从管道传递给它的一行:

$ 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

可以使用完全相同的方式使用所有其他脚本。

答案 2 :(得分:1)

您可以尝试这个awk:

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