Как использовать строки grep, основанные на определенной схеме?

Допустим, у меня есть файл, содержащий следующие две строки:

2014-05-05      09:11:53    /aa/bbbb/cccccc             29899
2014-05-05      09:12:17    /aa/bbbb/cccccc?dddddddd    16767 

Мне нужно получить строку, содержащую шаблон /aa/bbbb/cccccc, мне не нужна вторая строка, содержащая дополнительные символы, т.е. ?dddddddd. Теперь, когда я попробовал

grep '/aa/bbbb/cccccc' file

Затем обе линии были выбраны. Мне нужна полная строка, поэтому grep -o не может быть решением.

Каким может быть возможное решение с помощью grep, чтобы только первая строка выбиралась на основе шаблона поиска?

1
задан 16 November 2014 в 16:40

2 ответа

Простейшим способом было бы добавить пробел после вашего шаблона:

$ grep '/aa/bbbb/cccccc ' file
2014-05-05      09:11:53    /aa/bbbb/cccccc             29899

Или, чтобы соответствовать всем типам пробелов:

$ grep  '/aa/bbbb/cccccc[[:space:]]' file
2014-05-05      09:11:53    /aa/bbbb/cccccc             29899

Или

$ grep -P '/aa/bbbb/cccccc\s+' file
2014-05-05      09:11:53    /aa/bbbb/cccccc             29899

Или с положительным взглядом:

$ grep -P '/aa/bbbb/cccccc(?=\s)' file
2014-05-05      09:11:53    /aa/bbbb/cccccc             29899

Или с положительным lookahead :

$ grep -P '/aa/bbbb/cccccc(?!\S)' file
2014-05-05      09:11:53    /aa/bbbb/cccccc             29899

Или вы можете обратное совпадение:

$ grep  -v 'c?' file
2014-05-05      09:11:53    /aa/bbbb/cccccc             29899

Или также соответствовать строкам, которые содержат ничего, кроме вашего шаблона (без конечного пробела):

grep -P '/aa/bbbb/cccccc(\s+|$)' file 
grep -E '/aa/bbbb/cccccc(\s+|$)' file 

Или вы можете просто использовать небольшую script:

В awk:
$ awk '$3=="/aa/bbbb/cccccc"' file
2014-05-05      09:11:53    /aa/bbbb/cccccc             29899
Или, если вы не знаете, в каком поле находится ваш шаблон
$ awk '{for(i=1;i<=NF;i++){if($i=="/aa/bbbb/cccccc"){print}}}' file
2014-05-05      09:11:53    /aa/bbbb/cccccc             29899
В Perl
$ perl -ane 'print if grep {$_ eq "/aa/bbbb/cccccc"} @F' file
2014-05-05      09:11:53    /aa/bbbb/cccccc             29899
10
ответ дан 24 May 2018 в 01:49
  • 1
    @terdon в grep -v 'c?' file, почему вы не используете grep -v '?' file, потому что файл имеет только две строки. – αғsнιη 16 November 2014 в 20:49
  • 2
    @KasiyA true, я просто хотел сохранить немного картины. Вы совершенно правы, хотя в этом конкретном случае grep -v '?' будет достаточно. – terdon♦ 16 November 2014 в 22:37

В дополнение к ответу @ AvinashRaj вы также можете использовать такую ​​команду.

grep -P '/a+/b+/c+(?!\S)' file
2
ответ дан 24 May 2018 в 01:49

Другие вопросы по тегам:

Похожие вопросы: