Вывести имя файла, если grep находит несколько вхождений строки в файле, иначе выйти при ошибке - PullRequest
0 голосов
/ 09 июля 2020

File1 содержит

hello
hello

Мне нужно написать команду grep для печати имени файла, если этот файл содержит более одного «hello». В противном случае мне нужно, чтобы grep завершал работу в случае сбоя.

Пока что у меня есть

grep -c "hello" File1 | grep -v :0, но он выводит 2. Как мне получить желаемый результат, который должен быть либо именем файла File1, либо отсутствием вывода вообще (насколько я понимаю, отсутствие совпадения - это ненулевой код выхода для grep)

Ответы [ 3 ]

2 голосов
/ 09 июля 2020

с GNU grep для -z:

grep -lz 'hello.*hello' file

например:

$ seq 15 | grep -lz '3.*3'
(standard input)
$ echo $?
0

$ seq 5 | grep -lz '3.*3'
$ echo $?
1
0 голосов
/ 09 июля 2020

Использование в оболочке:

perl -0 -le '
    my $filename = $ARGV[0];
    print $filename if grep { /hello\nhello/ } <>
' file
0 голосов
/ 09 июля 2020

Вот так:

#!/bin/bash

count=$(grep -c "hello" "$1")
if ((count > 1)); then
    echo "$1"
else
    exit 1
fi

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

chmod +x script.sh
./script.sh File1

Пояснения:

((...)) - это команда arithmeti c, которая возвращает статус выхода 0, если выражение не равно нулю, или 1, если выражение равно нулю. Также используется как синоним «let», если необходимы побочные эффекты (присвоения). См. http://mywiki.wooledge.org/ArithmeticExpression

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