Сложный grep. Как я могу выделить этот номер?

У меня есть этот файл:

63 41,3,11,12 1 31,60,72,96 7 41,3,31,14,15,68,59,60 7 60,72,96 7 60 1 41,3,31,31,14,15,68,59,60 60 41,3,115,12,13,66,96 1 41,3,11,12,13,66,96 

Мне нужно набрать ‘7’ перед ’60’ (где за ’60’ не следует ’72, 96 ‘).

4 Solutions collect form web for “Сложный grep. Как я могу выделить этот номер?”

Модифицированный образец на основе комментариев

 $ cat ip.txt 7 60,72,96 7 60 3 601 2 60,72,962 5 60,3 43 60 3 52360 $ grep -oP '^\h*\K\d+(?=\h+60\h*$)' ip.txt 7 43 
  • -oP печатать только соответствующую часть, использует PCRE
  • ^\h*\K игнорировать начальные пустые символы строки
  • \d+ номер для печати
  • (?=\h+60\h*$) только если за ним следуют пустые символы, затем 60 а затем необязательные пробелы до конца строки

Или просто используйте awk для обработки на основе полей;)

Удаление только первого поля из строк, где второе поле точно равно 60 (должно работать с любым awk, а не только с GNU awk):

 awk '$2 == "60" {print $1}' < file 

Или с помощью grep и sed :

 grep -E '^[[:space:]]*[[:digit:]]+[[:space:]]+60[[:space:]]*$' < file | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]].*//' 

Ужасная однострочность в awk для общего случая, когда вы хотите строки с 60 но исключить точно те, которые также имеют пару 72,96 :

 awk 'function f(n) { return ($2 ~ "(^|,)" n "(,|$)") } f(60) && ! (f(72) && f(96)) {print NR, $1}' < file 

Функция f(n) проверяет, находится ли n в списке чисел во втором поле (при условии, что числа разделены запятыми или началом / концом поля). Тогда мы просто проверяем, что 60 присутствует, а пара 72,96 нет. Выходными данными являются номер строки ( NR ) и первое поле, но легко удалить номер строки, если вы этого не хотите.

Пытаться:

 $ cat infile 63 41,3,11,12 1 31,60,72,96 7 41,3,31,14,15,68,59,60 7 60,72,96 7 60 1 41,3,31,31,14,15,68,59,60 60 41,3,115,12,13,66,96 1 41,3,11,12,13,66,96 7 60,72,96 7 60 3 601 2 60,72,962 5 60,3 43 60 3 52360 $ grep -oP '^\s*[0-9]+(?= 60\s*$)' infile 7 7 43 

Описание:

 grep -P '^ # grep from start of line \s* # followed by optional spaces [0-9]+ # followed by some decimal digits (?= 60\s*$) # That have a 60 # but do not capture the 60. ' infile 

Мы можем использовать awk для разделения второго поля с пробелами на запятые. Если результат поля разделения больше одного значения, это не интересно, в противном случае, если ему 60, выведите первое поле с пробелами:

 awk 'split($2, a, ",") == 1 && $2 == 60 { print $1 }'  

Для приведенных данных примера это печатает 7 .

  • Заменить строку перед определенной строкой
  • Учитывая начальный токен ключа, за которым следует n токенов, чередуйте n токенов с ключом
  • как напечатать только часть каждой строки, которая помечается определенным символом
  • Получение последних строк, соответствующих шаблону в нескольких файлах
  • Как получить последние три последние даты файла журнала?
  • искать шаблон и всегда печатать первую строку, содержащую cn
  • Как заполнить пробелы в первом столбце значением, полученным из предыдущей непустой строки?
  • Пробуждение строки, сопровождаемое '\ n'
  • grep'ping файлы для нескольких строк (не в одной строке)
  • добавление строки в файл, если она отсутствует
  • bash уникальный идентификатор строки
  • Interesting Posts

    Время Bash ведет себя странно

    Любое программное обеспечение для изменения внутри изображений? Не только такие вещи, как размер изображения

    Калибровочное направление прокрутки Kali Linux

    Fedora 21 VT Изменение зависаний

    Просмотр двоичного кода не шестнадцатеричного

    Настройка переменных окружения для Gnome on Wayland только для сеанса

    Невозможно удалить файлы для мусора в подключенной файловой системе

    Как я могу сделать скринкаст исключительно из tty?

    Как я могу переместить строку состояния tmux в начало?

    Проблемы с компиляцией драйверов RealTek Wifi rtl8192ce на Fedora 21

    Возможно ли, чтобы nohup записывал выходные данные как в файл nohup.out AND, так и на экран / терминал?

    Какие оболочки использовались в ранних системах Unix?

    как создать пользовательский сеанс рабочего стола для x2go

    Символы внутри установленных cifs отображаются как каталоги

    Почему md5sum дает несогласованные результаты в файлах устройств?

    Linux и Unix - лучшая ОС в мире.