1

У меня есть команда, которая отправляет в stdout ряд чисел, каждый на новой строке. Мне нужно определить, существует ли конкретный номер в списке. Совпадение должно быть точным, а не подмножеством. Например, простой способ приблизиться к этому, который не работает, состоит в следующем:

/run/command/outputing/numbers | grep -c <numberToSearch>

Моя версия этого дает ложный положительный результат в следующем списке при поиске «456»:

1234567
98765
23
1771

Если счетчик не равен нулю, совпадение найдено или если он равен нулю, номер отсутствует в списке.

Проблема в том, что numberToSearch может соответствовать подпоследовательности чисел в строке, вместо этого я хочу только попадания по всей строке. Я посмотрел на man-страницу для grep и не нашел способа сопоставить только целые строки. Есть ли способ сделать это, или мне лучше использовать awk sed или какой-то другой инструмент? Мне нужен бинарный ответ о том, присутствует ли искомый номер или нет.

3 ответа3

5

Из руководства GNU grep:

`-x'
`--line-regexp'
     Select only those matches that exactly match the whole line.
     (`-x' is specified by POSIX.)

Так:

/run/command/outputing/numbers | grep -x <numberToSearch>

Вы получите целые матчи:

/run/command/outputing/numbers | grep -cx <numberToSearch> 

Вы получите количество совпадений на всю линию.

2
num=23
/run/command/outputing/numbers | grep -c "^$num$"

Замените 23 на номер, который вы ищете.

1

Добавляя к ответу Ансгара, рассмотрим -l ( строчная буква L) вместо -c .   Это ( -l) даст вам ответ да или нет.

/run/command/outputting/numbers | grep –l '^456$'

выведет « (standard input) » и выйдет со статусом 0, если найдена совпадающая строка; если текст не найден, он ничего не выведет и выйдет со статусом 1.  Некоторые версии grep также поддерживают опцию -q (quiet), которая подавляет все выходные данные и дает только статус выхода.

Они имеют то преимущество, что они могут выйти при первом обнаружении строки поиска, и им не нужно читать весь ввод.  Если вам нужна ваша команда для выполнения до конца, эти параметры могут быть вредными.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .