2014-11-14 2 views
0

Я использую команду для поиска файлов, смотрящих на определенный каталог в Unix, файлы, заканчивающиеся на * .sas и содержащие строку DB2. Затем я хочу найти результирующий набор файлов для строк DSN = или DATASRC =, а также распечатать строку, содержащую эти строки. Так что это команда НАЙДИТЕ Я использую:Закрепление файла в Unix для данной строки, а затем еще один набор строк в этом файле

find '/shrproj/' -type f -name '*.sas' -exec grep -il 'DB2' {} \; 2> /dev/null | xargs egrep -Ri 'DSN=|DATASRC=' 

Это дает мне нужный поток вывода:

/shrproj/files/stp_code/aea_aat_stp/icrv3/bin/macro/cnct_2_eaw.sas:     ,"DSN=%UPCASE(&the_database.)" 
/shrproj/files/stp_code/aea_aat_stp/icrv3/bin/macro/cnct_2_eaw.sas:     ,"DSN=%UPCASE(&the_database.)" 

Но теперь я также хочу, чтобы напечатать свойства файла (используя -ls вариант) после выше результата, т.е. ниже является то, что я намерен достичь:

/shrproj/files/stp_code/aea_aat_stp/icrv3/bin/macro/cnct_2_eaw.sas:     ,"DSN=%UPCASE(&the_database.)" 
/shrproj/files/stp_code/aea_aat_stp/icrv3/bin/macro/cnct_2_eaw.sas:     ,"DSN=%UPCASE(&the_database.)" 
61522 19 -rwxrwsr-x 1 sas  sas   18546 Jun 2 2010 /shrproj/files/stp_code/aea_aat_stp/icrv3/bin/macro/cnct_2_eaw.sas 

свойств файла в последней строке выше это же при использовании команды поиска с -ls опцией.

find /shrproj/files/stp_code/aea_aat_stp/icrv3/bin/macro/cnct_2_eaw.sas -ls 

Так как же я добиться этого это для каждого и каждый файл, используя очень первый Найти команду я использую выше?.

Пожалуйста, дайте мне знать. Благодарю.

+0

не [дважды задать вопросы] (http://unix.stackexchange.com/q/168046/60101)! – BroSlow

ответ

0

Нечто подобное ниже, должен работать

find /shrproj/ -type f -name '*.sas' \ 
-exec grep -iq 'DB2' {} \; \(\ 
    -exec grep -iq 'DSN=' {} \; -o \ 
    -exec grep -iq 'DATASRC=' {} \; \) \ 
-ls \ 
-exec egrep -i 'DSN=|DATASRC=' {} \; 

который имеет некоторую избыточность, так как логический -q выйдет на первый матч (поэтому не может быть использован в сочетании с печатью всех матчей), но не должен быть слишком медленными если у вас нет большого количества файлов с DSN= или DATASRC=, они найдены только в конце.

В качестве альтернативы, не злоупотребляя grep -q слишком много

find /shrproj/ -type f -name '*.sas' \ 
-exec grep -iq 'DB2' {} \; \ 
-exec bash -c 'out=$(egrep -i "DSN=|DATASRC=" "$1"); [[ -n $out ]] && echo "$out" && exit 0 || exit 1 ' bash {} \; \ 
-ls 
1

Для этого конкретного решения BroSlows задачи кажется лучшим (хотя и не обязательно является наиболее читаемым). Но что, если вам в будущем нужно что-то более продвинутое? Здесь GNU Parallel может вам помочь. Создайте сценарий или функцию bash, которую вы хотите запустить для каждого файла:

grepit() { 
    FILE="$1" 
    grep -qi DB2 "$FILE" && 
    egrep -qi 'DSN=|DATASRC=' && 
    ls -l "$FILE" 
} 
export -f grepit 

find '/shrproj/' -type f -name '*.sas' | parallel grepit 

Это будет работать 1 работа на ядро. В зависимости от вашей дисковой системы может потребоваться более быстрое выполнение большего или меньшего количества заданий параллельно (используйте для этого управление -j).

GNU Parallel - это общий параллелизатор, который позволяет легко запускать задания параллельно на одном компьютере или на нескольких компьютерах, к которым у вас есть доступ к ssh.

Если у вас есть 32 различных заданий, которые вы хотите работать на 4-х процессоров, прямо вперед способ распараллеливания является выполнение 8 заданий на каждом CPU:

Simple scheduling

GNU Parallel вместо порождает новый процесс, когда один заканчивается - поддержание процессоров активным и тем самым экономя время:

GNU Parallel scheduling

Установка

Если GNU Parallel не упакован для вашего дистрибутива, вы можете выполнить личную установку, которая не требует доступа root. Это может быть сделано в течение 10 секунд, делая это:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash 

Для других вариантов установки см http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Подробнее

Другие примеры: http://www.gnu.org/software/parallel/man.html

смотреть интро видео: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Прогулка по t он учебник: http://www.gnu.org/software/parallel/parallel_tutorial.html

Зарегистрируйтесь на список адресов электронной почты, чтобы получить поддержку: https://lists.gnu.org/mailman/listinfo/parallel