Скрипт awk onliner для поиска файлов под каталогом для 2 строк - PullRequest
0 голосов
/ 28 апреля 2011

Мне нужно искать файлы, у которых строка str1 появляется перед строкой str2. обе строки в отдельных строках.

например, file1 выглядит так:

abc
def
str1
ghi
str2

file2 выглядит так:

abc
str2
def
ghi
str1
pqe

Мой поиск должен вернуть file1.

Это должен быть однострочный скрипт, который я могу запустить в командной строке в Unix.

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 28 апреля 2011

Итак, вот ваш awk один лайнер

awk -vRS="\0777" '/str1.*str2/{print FILENAME}' file*
1 голос
/ 28 апреля 2011

Sed 1 лайнер для выше:

F="file1" && test ! -z $(sed -n '/str1/,/str2/{/^str2$/p;}' "$F") && echo "$F"

F="file2" && test ! -z $(sed -n '/str1/,/str2/{/^str2$/p;}' "$F") && echo "$F"

OUTPUT

file1

А вот awk один лайнер

F="file1" && awk '{if ($0 == "str1") {a=NR} else if ($0 == "str2" && a> 0 && a<NR) {print FILENAME} }' $F

F="file2" && awk '{if ($0 == "str1") {a=NR} else if ($0 == "str2" && a> 0 && a<NR) {print FILENAME} }' $F

OUTPUT

file1
0 голосов
/ 28 апреля 2011

Это не совсем одна строка, но вы можете удалить новые строки, и проблема решена:)

for file in $(ls) ; do
  awk "/str1/{found=1}/str2/{if(found) print \"$file\"}" $file
done

Что он делает: для каждого файла, указанного в ls, если в нем появляется str1, сценарий помечает его в переменной found:

/str1/{found=1}

затем, когда в строке появляется str2, он проверяет, установлен ли found. Если это так, печатается имя файла:

/str2/{
    if (found) 
        print "$file"
}

РЕДАКТИРОВАТЬ : есть еще более краткий способ решить вашу проблему, используя find и xargs:

find . -print0 -maxdepth 1 | \
    xargs -0 -I{} awk '/str1/{found=1}/str2/{if(found) print "{}"}' "{}"

Это также безопаснее, потому что он обрабатывает файлы с пробелами в их именах. Кроме того, вы можете расширить его для поиска в подкаталогах, просто удалив опцию -maxdepth 1. Обратите внимание, что сценарий awk не был изменен.

(всегда есть хорошее решение с использованием find и xargs, но это решение всегда немного сложно найти: D)

НТН!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...