Как я могу выполнить поиск подстроки в одном поле с помощью grep?

#linux #bash #grep

#linux #bash #grep

Вопрос:

Предположим, у меня есть файл csv:

 31,32,19,James Walker,321,James
21,31,49,Harry Bosh,282,Harry
32,12,03,Chris James,291,Chris
  

Как я могу использовать grep , а не awk искать вхождение «James» в четвертом поле?

Ответ №1:

Вы можете сделать это, убедившись, что для вашего регулярного выражения требуется, чтобы перед основным шаблоном стояли три запятые, и что шаблон (который должен сканироваться внутри поля) сам по себе не соответствует запятым, что приведет к его совпадению с пятым или более поздним полем:

 grep -E '^([^,]*,){3}[^,]*James'
  

«Сопоставьте с начала строки три повторения нулевых или более не-запятых, за которыми следует запятая. Это приводит нас к четвертому полю. В четвертом поле сопоставьте ноль или более знаков без запятых, за которыми следует James

Комментарии:

1. Это awk , это, awk … 🙂

Ответ №2:

Какой результат вы хотите?

 cat filename |grep "James" 
  

не удается выполнить ваше требование?

Комментарии:

1. Спасибо за ваш ответ. Приведенное выше — всего лишь пример. Что, если я просто хочу использовать grep в определенном поле?

2. Это не соответствует неявному требованию, что если James происходит в другом поле, это событие не должно быть найдено и сообщено. (Если бы это требование не было понято, не было бы упоминания о поиске в четвертом поле.)

3. Также cat file | grep pattern --> grep pattern file .

Ответ №3:

 grep -P --color '(?<=,)James(?=  )' file
31,32,19,**James** Walker,321,James
grep -oP '(?<=,)James(?=  )' file 
James
  

Ответ №4:

Спасибо, ребята! Сначала я завершаю операцию с cut файлом, чтобы извлечь нужное поле, а затем grep нужную строку. К вашему сведению:

 cut -d -f4 name.csv | grep 'James"