найти две строки в выводе с && в bash - PullRequest
0 голосов
/ 19 декабря 2018

Я хочу найти две строки, если они существуют в моем выводе, и затем передать их в качестве аргументов в следующей команде.

ex:

for X = 1 to 100
    cat logX.txt | grep -e string1 -e string2 | rm logX.txt

но я не могузнать, как достичь выше.

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

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Вы можете сделать это с помощью find:

find . -name 'log*.txt' -exec grep -E 'string1' {} \; -exec grep -E 'string2' {} \; -exec rm {} \;

При этом будет найдено logN.txt, grep для string1, если совпадает, то grep для string2, а если совпадение, удалите файл.

Согласно комментарию ниже, добавьте -maxdepth 1, если вы хотите найти файлы только в текущем каталоге.

0 голосов
/ 23 декабря 2018

Использование GNU Parallel:

parallel 'grep string1 log{}.txt && grep string2 log{}.txt && rm log{}.txt' ::: {1..100}

Если вы хотите просмотреть все файлы журнала * .txt, то это будет короче:

parallel 'grep string1 {} && grep string2 {} && rm {}' ::: log*.txt
0 голосов
/ 19 декабря 2018

Если вы хотите удалить только файлы с обоими совпадениями, awk - это полноценный язык программирования, которому можно дать выражение, которое проверяет флаги независимо, - более уместно, чем grep (который изменяетего состояние выхода зависит от того, найдены ли какие-либо совпадения, а не от совпадения всех приведенных выражений.

string1="first regex"
string2="second regex"
for ((x=1; x<=100; x++)); do
  file="log$x.txt"
  awk -v string1="$string1" -v string2="$string2" '
    BEGIN { found1=0; found2=0; }
    $0 ~ string1 { found1=1; }
    $0 ~ string2 { found2=1; }
    END { exit(!(found1 && found2)) }
  ' "$file" && rm -f -- "$file"
done

Эквивалент grep будет намного меньшеэффективный, поскольку он должен читать каждый файл дважды:

# MUCH SLOWER ON BIG FILES: Reads each file twice (up to the point where a match exists)
string1="first regex"
string2="second regex"
for ((x=1; x<=100; x++)); do
  file="log$x.txt"
  grep -q -e "$string1" -- "$file" && grep -q -e "$string2" -- "$file" && rm -f -- "$file"
done
...