Unix,find,ls,grep和sort

时间:2011-01-23 04:27:59

标签: unix

使用这个Unix命令,我尝试搜索目录中的文本

find . -type f -iname *index*jsp -print | xargs ls -t | xargs grep body

./apache-tomcat-6.0.18/a/index.jsp:<body>
./apache-tomcat-6.0.18/b/index.jsp: <body>

但是这个结果并不完美,我想得到匹配字符串的文件创建日期和行号,比如

./apache-tomcat-6.0.18/a/index.jsp: 2011-1-2 Line 3
./apache-tomcat-6.0.18/b/index.jsp: 2011-1-1 Line 4

我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:4)

您可能想要获得所需的格式(在bash / Linux中,未经测试):

find . -type f -iname \*index\*jsp -print |
while read f; do
  if grep -q body "$f"; then
    modified_time=`stat -f %c "$f"`
    match_line=`awk '/body/ {print NR; exit}' "$f"`
    echo "$f $modified_time Line $match_line"
  fi
done

答案 1 :(得分:1)

首先,UNIX中没有记录文件创建日期。对于行号,这适合:

find . -type f -iname '*index*jsp' -exec grep -n body '{}' ';'

答案 2 :(得分:0)

find . -name index* | xargs ls -t | xargs grep -Z body \
    | tr -s " " \
    | cut -d $'\0' -f 1 | uniq \
    | xargs -n 1 -I {} -exec sh -c \ "
        echo -n {} \" \"; \
        ls -lt {} | tr -s \" \" | cut -d \" \" -f 6; \
        grep -n body {} | cut -d ":" -f 1
    "

这就像我可以接近它一样。

答案 3 :(得分:0)

1)你必须屏蔽* index * jsp。否则shell将解析它,如果您碰巧有一个文件a-index-0.jsp,find将面临该替换。

 find . -type f -iname "*index*jsp" -print | xargs ls -t | xargs grep body

2)print is,默认情况下发现的是什么。

 find . -type f -iname "*index*jsp" | xargs ls -t | xargs grep body

3)find有可能用-exec调用外部程序;无需通过管道调用xargs。

 find . -type f -iname "*index*jsp" -exec ls -t {} ";" -exec grep -n body {} ";"

4)格式化find的输出可以通过find本身来完成--cTime,mTime和breakfeasttime。 ;)看看你自己(男人发现)为-printf提供了大量的选择,尤其是时代。

 find tmp -type f -iname "*index*jsp" -printf "%H/%f\t %CD\t" -exec grep -n body {} ";"

5)为什么?

如果你的发现(如GNU-find)有这些选项,你就不必对文件名中的空白进行清理。文件名中的空白难以处理 - find -print0 | xargs ...可以执行此操作,但如果您继续查找,则无需执行此操作。但如果你打电话给&#34; ls&#34;,你就会迷路。

也许您当前的命令不会产生名称中带有空格/换行符/制表符的文件。精细。但是,学习更好的方法并不断地进行沟通可以防止以后和其他人的错误。