我有一个动态输出。有时这样:
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}')
但是,这仅占空格之后的最后一部分,而不是完整的数据。因此,这仅在数据没有空格的情况下有效。
我想要的是在包含它们的情况下始终获取最后的数据及其空格。有帮助吗?
答案 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