BASH: как Grep и отображает набор значений

В примере сообщения журнала мы имеем

20161110-15:29:39.707932513|8=FIX.4.29=031735=D34=00000389552=20161110-15:29:39.70749=413050=11156=DDG109=4130115=EAGLE7|EAGLE7116=eagle_fix_trader11|eagle_fix_trader11144=DAU|E7T9139=eagle_fix_trader119195=U439=805440=150854029208=221=1167=FUT55=14198040=259=054=111=41301110400144=0000035.0000000038=00000000760=20161110-15:29:39.70710=092 

из вышесказанного, как вы можете отображать только значение 9139, чтобы оно выглядело

 9139=eagle_fix_trader11 

Я использовал команду ниже

 ls | grep -Eo '9139=[az]{0,8}' 9707le8.log 

Но я только получаю

 9139=eagle 

вместо

 9139=eagle_fix_trader11 

Есть идеи?

  • Набор библиотек, таких как ncurses в сценарии оболочки
  • Показать текст в виде звездочек
  • Должен ли я использовать косую черту в конце переменных пути в сценарии оболочки или нет?
  • Как объединить три файла (и пропустить первую строку одного файла) отправить его в качестве вкладов в мою программу?
  • Шаблон Regex для замены нескольких значений с помощью sed
  • Создание личного монтирования tmpfs в сценарии оболочки
  • Является ли `bash --posix` необходимым для bash 4, когда передается опция` set` для подсетей?
  • Как сравнить число с плавающей запятой в сценарии оболочки
  • One Solution collect form web for “BASH: как Grep и отображает набор значений”

    Прежде всего, ls | это совершенно бесполезно. Вы хотите выполнить поиск внутри файла 9707le8.log , а не в списке файлов и 9707le8.log в вашем текущем каталоге (что и печатает ls ). В любом случае grep игнорирует любые входящие в него сообщения ( | grep ), когда ему также предоставляется имя файла для поиска в командной строке, как у вас.

    Тем не менее, ваше регулярное выражение означает «найти строку 9139= , а затем <= 8 строчных букв». Однако после = 5 букв; 6-й символ – это _ и который не является частью группы символов [az] . Простое решение – добавить его в класс:

     $ grep -Eo '9139=[a-z_]{0,8}' 9707le8.log 9139=eagle_fi 

    Теперь, поскольку вы хотите 9139=eagle_fix11 , вам нужно увеличить символы:

     $ grep -Eo '9139=[a-z_]{0,18}' 9707le8.log 9139=eagle_fix_trader 

    На этот раз проблема заключается в том, что вы не сопоставляете числа, поскольку [a-z_] не включает их. Итак, вы хотите что-то вроде этого:

     $ grep -Eo '9139=[a-z_0-9]{0,18}' 9707le8.log 9139=eagle_fix_trader11 

    Или, для более общего случая, где вы хотите 9139= строкой строчных букв или _ а затем двумя номерами, вы можете использовать:

     $ grep -Eo '9139=[a-z_]+[0-9]{2}' 9707le8.log 9139=eagle_fix_trader11 

    Или, с GNU grep:

     $ grep -Po '9139=[a-z_]+\d{2}' 9707le8.log 9139=eagle_fix_trader11 
    Linux и Unix - лучшая ОС в мире.