Solaris unix, c-shell, перенаправление вывода выполненной команды xargs

У c-shell нет выбора. Это то, что мы используем здесь.

Итак, я хочу проанализировать текущий каталог и все подкаталоги в поисках файлов формы *.utv и egrep, чтобы найти в файле определенный номер учетной записи.

Я пробовал что-то вроде этого:

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

but got "Too many words from `` " message.

So using xargs because apparently I'm getting too many file names passed back to egrep command-line.

When I do this:

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

"ps -ef" command shows:

% 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.

Я уверен, что это просто вопрос группировки, правильного цитирования и/или наличия перенаправления в нужном месте, но после довольно большого количества проб и ошибок (и поиска здесь) я все еще ничего не получаю.

Какие-либо предложения?


person user2285103    schedule 16.04.2013    source источник


Ответы (1)


Вам нужны только одинарные или двойные кавычки (но не оба) вокруг поиска, как в исходной команде:

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

Я бы также потерял -n1, -i и {} из командной строки. Уловка, чтобы всегда отображать имена файлов в списке, заключается в том, чтобы указать /dev/null в качестве имени, но -l также выполняет эту работу:

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

И нужно просветить власть имущих, что оболочка C не годится для программирования. И вы всегда можете добавить exec /bin/bash -l в свой скрипт .login (или использовать /bin/ksh вместо /bin/bash). У меня просто не было бы грузовика с правилами «Вы не можете использовать разумную, цивилизованную оболочку».

person Jonathan Leffler    schedule 16.04.2013
comment
LOL... Спасибо, очень признателен! - person user2285103; 17.04.2013