我知道awk
可用于仅打印输出中的某些单词。例如
dpkg -l|awk '{print $2}'
将从dpkg -l
的输出中打印第二个单词。
我想要做的是,在给定的单词之后打印每个单词。我的命令看起来像这样
awk '{printf "%-40s %s\n", $1, $n}'
我打算使用$n
或$0
来打印所有单词,而不是打印所有单词,比如第5个字符。
我该怎么做?
编辑:我的完整命令是
bind -P|grep "can be found"|sort|awk '{printf "%-40s %s\n", $1, $n}'
这样可以输出
abort abort can be found on "\C-g", "\C-x\C-g", "\e\C-g".
accept-line accept-line can be found on "\C-j", "\C-m".
backward-char backward-char can be found on "\C-b", "\eOD", "\e[D".
backward-delete-char backward-delete-char can be found on "\C-h", "\C-?".
character-search-backward character-search-backward can be found on "\e\C-]".
character-search character-search can be found on "\C-]".
clear-screen clear-screen can be found on "\C-l".
还有更多行。 “中止可以找到”,类似的行是无关紧要的,我不想要它们,但我想要那些5个字符之后的所有内容。
所以输出应该看起来像
abort "\C-g", "\C-x\C-g", "\e\C-g".
accept-line "\C-j", "\C-m".
backward-char "\C-b", "\eOD", "\e[D".
backward-delete-char "\C-h", "\C-?".
如何使用awk或任何其他命令执行此操作?我需要保留柱状输出。
答案 0 :(得分:2)
尝试以下:
many commands | awk '{for(i=6;i<=NF;i++){printf "%s\n", $i}}'
如果您不想在下面使用换行符,请打印从第6场开始的所有内容:
many commands | awk '{for(i=6;i<=NF;i++){printf "%s ", $i}}'
修改强>
以下是完整的问题:
bind -P|grep "can be found"|sort | awk '{printf "%-40s", $1} {for(i=6;i<=NF;i++){printf "%s ", $i}{printf"\n"}}'
提供输出:
abort "\C-g", "\C-x\C-g", "\e\C-g".
accept-line "\C-j", "\C-m".
backward-char "\C-b", "\eOD", "\e[D".
backward-delete-char "\C-h", "\C-?".
backward-kill-line "\C-x\C-?".
etc...
答案 1 :(得分:0)
在这种情况下使用更好的工具,如perl:
perl -lne 'print $1 if(/\b(myword .*)/)'
不确定您要找的是什么。但这会删除该行中的前5个单词:
awk '{for(i=6;i<=NF;i++){printf $i" "}print ""}'
答案 2 :(得分:0)
如果您需要明确使用AWK,可以尝试以下方法:
awk '{ if( match($0,"^.{5}[^[:space:]]*[[:space:]]([^[:space:]]+)(:?$|[[:space:]])", arr) ) {print arr[1]}}'
匹配功能可确保在开始捕获单词之前至少有5个字符(空白和字母数字)。如果第五个字符后面的下一个元素是单词的中间,它只是忽略它并转到下一个完整单词并捕获它。 arr中的第一个位置对应于正则表达式中捕获的元素,这是第五个字符后面的第一个完整单词。
答案 3 :(得分:0)
保存第一个字段。作为条件/模式,尝试用空字符串替换&#34;。*可以在&#34;上找到。如果发生替换,请打印保存的第一个字段以及$ 0左边的任何内容。
bind -P | awk '{ first = $1 } sub(/.*can be found on /, "") { printf "%-40s%s\n", first, $0 }
在原始版本中:
绑定-P | grep&#34;可以找到&#34; | sort | awk&#39; {printf&#34;% - 40s%s \ n&#34;,$ 1,$ n}&# 39; $ n中的n计算为0,因此awk会打印第一个单词和整个记录。