在线打印最后 n 列

Chr*_*ten 3 aix awk

如何使用 awk 打印最后 4 列?

以下解决方案适用于数字:

命令:

echo "1 2 3 4 5" | awk '{print $(NF-3),$(NF-2),$(NF-1),$NF}'
Run Code Online (Sandbox Code Playgroud)

输出:

2 3 4 5
Run Code Online (Sandbox Code Playgroud)

但是,当我使用带有如下特殊字符的文本时,我收到语法错误:

echo "2023-01-03 01:05:06:       Table test completed      (0 hrs 0 mins 0.009 Secs)" |  awk '{print $(NF-3),$(NF-2),$(NF-1),$NF}'
Run Code Online (Sandbox Code Playgroud)

输出:

> " | awk '{print $(NF-2),$(NF-1),$NF}'
mins 0.009 Secs)
awk: The field -2 cannot be less than 0.

The input line number is 2.
The source line number is 1.
Run Code Online (Sandbox Code Playgroud)

我期望打印出上面示例的以下内容:

(0 hrs 0 mins 0.009 Secs)
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现这个目标?

Rav*_*h13 5

第一个解决方案:使用您显示的示例,请尝试以下awk代码。简单的解释是:使用match的函数awk。使用正则表达式到\(.*\)$匹配字符串,如果找到匹配,则打印子字符串,该子字符串将根据OP的要求仅打印匹配的值。()

echo "2023-01-03 01:05:06:       Table test completed      (0 hrs 0 mins 0.009 Secs" |
awk 'match($0,/\(.*\)$/){print substr($0,RSTART,RLENGTH)}' Input_file
Run Code Online (Sandbox Code Playgroud)

第二个解决方案:如果您的输入文件始终具有“表测试已完成”,那么您可以使其比第一个解决方案更容易,然后尝试以下操作:

echo "Your_string" |
awk -F'[[:space:]]+Table test completed[[:space:]]+' '{print $NF}' 
Run Code Online (Sandbox Code Playgroud)