使用这个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
我怎样才能做到这一点?
答案 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;,你就会迷路。
也许您当前的命令不会产生名称中带有空格/换行符/制表符的文件。精细。但是,学习更好的方法并不断地进行沟通可以防止以后和其他人的错误。