Как grep несколько файлов, используя часть имени файла как шаблон?

У меня есть папка, которая содержит несколько файлов с именем order[ID].log где [ID] – строка, например

 orderID1.log orderID2.log orderID3.log orderID4.log ... 

Мне нужно написать сценарий в Linux, чтобы grep каждого файла по ID в их имени и вывести результат в файл с именем ID.log Пример:
Для orderID1.log мне нужно grep 'ID1' orderID1.log > ID1.log
Для orderID2.log мне нужно grep 'ID2' orderID2.log > ID2.log
Я попытался написать сценарий ниже,

 for i in ORDER*.log do grep 'i' order$i > $i.log; done 

Проблема здесь в том, что я буду записывать как «orderID1», «orderID2», а не «ID1», «ID2». Есть ли простой способ сделать это в Linux?

One Solution collect form web for “Как grep несколько файлов, используя часть имени файла как шаблон?”

Вам нужно будет извлечь подстроку ID из имен файлов. Один из способов сделать это – это расширение параметра, например ${var:offset:length} поэтому в вашем случае var is f ilename, offset – 5 ( order ), а длина – ${#f}-9 (т. Е. Общая длина ${#f} минус объединенная длина order и .log которая равна 9 символам):

 for f in order*.log do ID=${f:5:${#f}-9} grep -- "$ID" "$f" > "$ID".log done 

или если вы предпочитаете один лайнер:

 for f in order*.log; do ID=${f:5:${#f}-9}; grep -- "$ID" "$f" >" $ID".log; done 

Кроме того, вы можете использовать awk для применения одного и того же действия к нескольким файлам :

 awk ' FNR==1{ if(fname)close(fname) id=substr(FILENAME, 6, length(FILENAME)-9) fname=id".log" } $0 ~ id{ print > fname } ' order*.log 

Это делает все файлы с одним вызовом awk , избегая цикла оболочки. В одной строке:

 awk 'FNR==1{if(f)close(f);id=substr(FILENAME, 6, length(FILENAME)-9);f=id".log"} $0~id{print > f}' order*.log 
  • Поиск файлов для строки и если найден, проверьте, существует ли файл с парным именем в том же каталоге
  • Искать значение только в одном столбце wo с помощью awk, sed или perl
  • с использованием простого выражения квантора регулярных выражений в grep
  • Проверьте, содержит ли переменная только то, что я хочу, и ничего больше
  • Perl один вкладыш для поиска слов длиной более 63 символов
  • grep ведет себя ненормально
  • Уникальная идентификация Java-процессов с тем же именем
  • regexp, который соответствует всем токенам независимо от порядка
  • Отменить все переменные ENV, соответствующие _PROXY
  • Перечисление определенных строк в перечисленных файлах
  • сравнить два файла, получить идентичный список
  • Interesting Posts

    Как определить, когда Android-устройство подключено через USB-модем и получить его имя интерфейса?

    Недопустимое присвоение zsh в функции канала

    OpenVPN: защитить ваш клиентский ключ / cert / conf от кражи?

    avconv / ffmpeg через / dev / ttyAMA0

    Почему многие команды предоставляют «тихий» вариант?

    Скользящее среднее в файле журнала с awk или другими утилитами unix?

    Не удается запустить KDE в Fedora 22

    Удалите блок строк с условием на последней строке

    show вводит новый пароль в команде unix "passwd"

    Отказано в доступе к эхо (пытается использовать команду echo вместо команды ls в сценарии оболочки)

    awk конкретный столбец с неожиданным разрывом строки

    Как запустить новый дистрибутив Linux?

    Как удалить новые строки из ip в качестве вывода?

    Как использовать grep с шаблонами в файле и получить количество вхождений каждого шаблона?

    Как получить код статуса grep, расположенный в поиске

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