代码之家  ›  专栏  ›  技术社区  ›  dan

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

awk
  •  4
  • dan  · 技术社区  · 15 年前

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

    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 回复  |  直到 15 年前
        1
  •  3
  •   Dennis Williamson    15 年前

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

    history 10 | cut -c 8-
    
        2
  •  4
  •   ghostdog74    15 年前

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

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

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

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

    借鉴Pax的解决方案,使用regex的awk版本(谁说你需要sed):)

    awk '{gsub(/^ *[^ ]* */,"")}1' file
    
        3
  •  1
  •   paxdiablo    15 年前

    如果您不反对使用其他工具,请尝试 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
    

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

    如果行格式可以绑定到行开头的任意数字,后跟两个空格,然后是您感兴趣的文本,则可以使用(行后面有两个空格)稍微改进regex * ):

    sed 's/^[0-9]*  //'
    
        4
  •  0
  •   Jamie    15 年前

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

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

    注意 sub 默认为 $0 这样你就可以操作了。

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