有没有简洁的方法让awk打印除记录的第一个字段之外的所有内容?

时间:2009-12-22 14:11:58

标签: awk

我想将命令从我最近的命令历史记录复制到文件中,但历史记录如下:

568  find . -name "*.txt" -mtime -1 -print -exec awk '$9 != "" && NR <= 10' {} \;
569  find . -name "*.txt" -mtime -1 -print -exec awk '$9 != "" && n < 10 {print; n++}' {} \;
570  history 10

我想剥掉左边的数字。有没有一个简短的方法在awk中这样做而没有明确地使用$ 2 $ 3 $ 4等来输出除第一个字段之外的所有内容?

4 个答案:

答案 0 :(得分:4)

如果你不介意前面的小空间

awk '{$1="";print}' file

否则,做一个额外的sub / gsub来摆脱它。另一种方法是使用for循环

awk '{for(i=2;i<=NF;i++) printf "%s " ,$i}' file

借用pax的解决方案,使用正则表达式的awk版本(谁说你需要sed):)

awk '{gsub(/^ *[^ ]* */,"")}1' file

答案 1 :(得分:3)

如果你不介意使用awk以外的东西:

history 10 | cut -c 8-

答案 2 :(得分:1)

如果您不反对使用其他工具,请尝试使用sed,这样可以更好地保留原始文件的间距:

pax> cat qq.in
568  find . -name "*.txt" -mtime -1 -print -exec awk '$9 != "" && NR <= 10' {} \;
569  find . -name "*.txt" -mtime -1 -print -exec awk 'blah blah' {} \;
570  history 10

pax> cat qq.in | sed 's/^ *[^ ]* *//'
find . -name "*.txt" -mtime -1 -print -exec awk '$9 != "" && NR <= 10' {} \;
find . -name "*.txt" -mtime -1 -print -exec awk 'blah blah' {} \;
history 10

它基本上剥离任何前导空格,后跟任何非空格字符,后跟空格字符,有效地删除每行中的第一个单词。

如果行格式可以绑定到行开头的任意位数后跟两个空格然后是你感兴趣的文本,你可以稍微改进正则表达式({后面有两个空格} {1}}):

*

答案 3 :(得分:0)

这是awk中的另一种选择,它也可以保留空格。

history | awk '{sub($1, "", $0); sub(/^[ \t]+/, "", $0); print}'

请注意,sub默认为$0,因此您可以省略此项。

history | awk '{sub($1, ""); sub(/^[ \t]+/, ""); print}'