#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"