2009-12-22 34 views
4

我想从我最近的命令历史记录中复制命令到一个文件,但历史是这样的:是否有简洁的方式让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等来输出除第一个字段之外的所有内容?

回答

3

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

history 10 | cut -c 8- 
+0

当序列号在其中的位数不同时这是否正常工作? – paxdiablo 2009-12-22 23:40:36

+0

我相信这些数字是固定宽度的,但使用这种技术是脆弱的,因为它依赖于可能不可靠的事情。 – 2009-12-23 00:45:04

+0

其实我纠正了。刚刚测试过,它们的宽度确实是固定的。这可能比任何正则表达式解决方案都快,所以+1(即使速度在这里并不重要)。 – paxdiablo 2009-12-23 11:06:01

4

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

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

否则,做一个额外的子/ GSUB摆脱它。另一种方法是从PAX的解决方案中使用了循环

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

借款时,用awk版本的正则表达式(谁说,你需要SED):)

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

谢谢,这个作品 – dan 2009-12-22 14:25:06

+0

不需要子/ GSUB删除前导空格;只需使用'substr($ 0,2)'。这假定OFS只是一个字符长,默认情况下是真的。 – dubiousjim 2012-04-19 04:13:49

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 

它基本上剥去任何前导空格后面的任何非空格字符,其次是空间甜心可以有效地消除每行中的第一个单词。

如果行格式可以绑定到行首的任意位数,然后是两个空格,然后是您感兴趣的文本,您可以稍微改进正则表达式(其后有两个空格) *):

sed 's/^[0-9]* //' 
0

这是在AWK的替代也保留空白。

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

注意sub默认为$0,因此您可以ommit这一点。

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