Допустим, у меня есть файл, содержащий следующие две строки:
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, чтобы только первая строка выбиралась на основе шаблона поиска?
Простейшим способом было бы добавить пробел после вашего шаблона:
$ 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
В дополнение к ответу @ AvinashRaj вы также можете использовать такую команду.
grep -P '/a+/b+/c+(?!\S)' file