如何使用 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)
我怎样才能实现这个目标?
第一个解决方案:使用您显示的示例,请尝试以下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)