如何使用awk打印一系列单词?

时间:2014-04-08 06:48:41

标签: bash awk text-processing

我知道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或任何其他命令执行此操作?我需要保留柱状输出。

4 个答案:

答案 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 ""}'

Tested

答案 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会打印第一个单词和整个记录。