Solaris unix, c-shell,重定向xargs执行命令输出



对c-shell没有选择。这是我们在这里使用的。

所以我想解析当前目录和所有子目录寻找形式*的文件。Utv和egrep分别在文件中查找特定的帐号。

我试过这样做:

egrep -l "ACCOUNT NO: +700 " `find . -name "*.utv" ` | more   

但是收到了"Too many words from ' ' "消息。

所以使用xargs,因为显然我有太多的文件名传递回egrep命令行

当我这样做时:

find . -name "*.utv" | xargs -n1 egrep -i -l '"ACCOUNT NO: +700 "' {} >&! /home/me/output.txt

"ps -ef"命令显示:

% ps -ef | egrep -i "myuserid"  
myuserid 20791 22549   0 18:19:38 pts/20      0:00 find . -name *.utv  
myuserid 20792 22549   0 18:19:38 pts/20      0:00 xargs -n1 egrep -i -l "ACCOUNT NO: +700 "  
myuserid 22774 20792   1 18:21:13 pts/20      0:04 egrep -i -l "ACCOUNT NO: +700 " ./01/130104_reportfile.utv  
%

但是我在"output.txt"文件中没有得到任何输出。

如果在同一目录中手动运行egrep部分,将得到包含帐户700字符串的文件名列表。

我确信这只是一个分组,引用适当,和/或重定向在正确的地方的问题,但经过相当多的尝试和错误(和搜索在这里)我仍然没有得到任何地方。

有什么建议吗?

您只需要在搜索周围使用单引号或双引号(但不需要同时使用双引号),就像您的原始命令一样:

find . -name "*.utv" | xargs -n1 egrep -i -l "ACCOUNT NO: +700 " {} >&! /home/me/output.txt
find . -name "*.utv" | xargs -n1 egrep -i -l 'ACCOUNT NO: +700 ' {} >&! /home/me/output.txt

我也会从命令行中丢失-i, {}/dev/null。总是列出文件名的一个技巧是指定-l作为文件名,但exec /bin/bash -l也可以完成此工作:

find . -name "*.utv" | xargs egrep -l 'ACCOUNT NO: +700 ' >&! /home/me/output.txt

你需要让当权者明白C shell并不适合编程。您可以将.login添加到/bin/ksh脚本中(或者使用/bin/bash代替-n10)。我根本不会赞同"你不能使用理智、文明的外壳"的规则。

最新更新