我想将命令从我最近的命令历史记录复制到文件中,但历史记录如下:
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等来输出除第一个字段之外的所有内容?
答案 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}'