Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix、find、ls、grep和sort_Unix - Fatal编程技术网

Unix、find、ls、grep和sort

Unix、find、ls、grep和sort,unix,Unix,使用这个Unix命令,我尝试在目录中搜索文本 find . -type f -iname *index*jsp -print | xargs ls -t | xargs grep body /apache-tomcat-6.0.18/a/index.jsp: /apache-tomcat-6.0.18/b/index.jsp: 但是这个结果并不完美,我想得到文件创建日期和匹配字符串的行号,如 /apache-tomcat-6.0.18/a/index.jsp:2011-1-2第3行 /apac

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

find . -type f -iname *index*jsp -print | xargs ls -t | xargs grep body
/apache-tomcat-6.0.18/a/index.jsp:

/apache-tomcat-6.0.18/b/index.jsp:

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

/apache-tomcat-6.0.18/a/index.jsp:2011-1-2第3行

/apache-tomcat-6.0.18/b/index.jsp:2011-1-1第4行


如何实现这一点?

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


要获得所需的格式,您可能需要执行以下操作(在bash/Linux中,未经测试):

这是我能做的最接近的了


这差不多是我能做到的最接近的了。

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

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

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

find . -type f -iname '*index*jsp' -exec grep -n body '{}' ';'
1) 您必须屏蔽*index*jsp。否则shell将解决它,如果您碰巧有一个文件a-index-0.jsp,find将面临这个替换

 find . -type f -iname "*index*jsp" -print | xargs ls -t | xargs grep body
2) 打印是find默认的功能

 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.。)查看您自己(man find)的大量-printf选项,尤其是时报

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

如果您的查找像GNUFind一样具有这些选项,则不必对文件名中的空格进行清理。文件名中的空白很难处理-
find-print0 | xargs…
可以处理,但如果您一直使用find,则不必处理。但如果你叫“ls”,你就迷路了

可能您当前的命令不会生成名称中包含空格/换行符/制表符的文件。好的但是学习更好的方法,并不断地交流,可以防止以后和其他人出现错误。

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

 find . -type f -iname "*index*jsp" -print | xargs ls -t | xargs grep body
2) 打印是find默认的功能

 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.。)查看您自己(man find)的大量-printf选项,尤其是时报

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

如果您的查找像GNUFind一样具有这些选项,则不必对文件名中的空格进行清理。文件名中的空白很难处理-
find-print0 | xargs…
可以处理,但如果您一直使用find,则不必处理。但如果你叫“ls”,你就迷路了


可能您当前的命令不会生成名称中包含空格/换行符/制表符的文件。好的但是,学习更好的方法,并不断地与他人沟通,可以防止以后和他人犯错误。

你应该问这个问题。不,该死的。编程问题也是如此,而shell编程就是编程@乔纳森·莱夫勒:不是,除非你真的写了一个完整的程序。这是一个简单的一行程序。@leppie-这不是一个一行程序,它是在Shell编程语言中-这表明这是一个关于Shell编程的问题,这是编程,这是我们的主题。@Jonathan Leffler:你应该告诉Atwood,unix.stackexchange.com在这种情况下是多余的。你应该问这个问题。不,该死。编程问题也是如此,而shell编程就是编程@乔纳森·莱夫勒:不是,除非你真的写了一个完整的程序。这是一个简单的一行程序。@leppie-它不是一个一行程序,而是在Shell编程语言中-这表明这是一个关于Shell编程的问题,这是编程,这是关于SO的主题。@Jonathan Leffler:你应该告诉Atwood unix.stackexchange.com在这种情况下是多余的。该死!这必须是一种方法,以单行方式:(+1,但是…从这个问题上看,不清楚它是否只是文件中需要的第一个匹配项,还是每个匹配项。支持“first”的事实是,示例中没有一行用于
标记,该标记可能出现在引用的文件中。您的多行匹配输出会很有趣,带有一行nu在同一个文件中,第二个匹配项和后续匹配项没有前缀的mber。困难的部分是查找行号——如果没有行号,整个过程可以通过
-exec
-printf
选项来
查找
。我没有办法让
grep
只输出行号;
awk'/body/{print NR;exit}'
确实有效。@Jonathan Leffler--
-m1
选项到
grep
应该(根据手册页)只输出第一个匹配项,避免了您提到的问题。@MK:可能不是一种在一行中实现这一点的方法,除非您对虐待狂的Perl(Python,…)或类似扭曲的shell感兴趣(如果在相关位置添加分号,则整个脚本可以放在一行上)。顺便说一句,第一行上的尾随反斜杠是不必要的;这是一个真实的shell,而不是正在使用的sea shell。该死!这一定是单行的方式:(+1,但是…从这个问题上看,不清楚它是否只是文件中需要的第一个匹配项,还是每个匹配项。支持“first”的事实是,示例中没有一行用于
标记,该标记可能出现在引用的文件中。您的多行匹配输出会很有趣,带有一行nu在同一个文件中,第二个匹配项和后续匹配项没有前缀的mber。困难的部分是查找行号——如果没有行号,整个过程都可以使用
-exec
-printf
选项来
查找
。我看不到一种方法可以让
grep
找到