2015-04-20 2 views
2

Так у меня есть каталог, который включает в себя кучу текстовых файлов, так и внутри каждого файла есть строка, которая имеет метку времени файла, который имеет формат:Получить имя файла, когда регулярное выражение соответствует содержание

TimeStamp: mm/dd/yyyy 

I Я пишу сценарий, который принимает 3 входа: месяц, дату и год, и я хочу получить имя файлов, у которых метки времени совпадают с входами.

Я использую эту строку кода для соответствия файлам и вывода всех строк, найденных в другой файл.

egrep 'TimeStamp: "$2"/"$3"/"$1"' inFile > outFile 

Однако, я не понял способ получить имена файлов во время процесса. Кроме того, я считаю, что есть быстрый и простой способ сделать это с помощью awk, но я новичок в awk, поэтому я все еще борюсь с ним.

ответ

1

Примечание:

  • Я предполагаю, что вы хотите, чтобы ОБА захвата, соответствующие линии И, ОТДЕЛЬНО, имена (пути) из файлы, имеющие совпадения (поэтому, используя только egrep -l, не достаточно).
  • Основываясь на ваш вопрос, я изменил 'TimeStamp: "$2"/"$3"/"$1"' к "TimeStamp: $2/$3/$1", потому что первый будет относиться к $2 ... , как литералы (не будет расширять их), из-за быть вписана в одной -quoted строки.

Если у вас уже есть одного файла перейти на egrep, вы можете использовать && условно вывод, что имя файла если этот файл содержал матчи (в дополнение к захвата спички в файле).

egrep "TimeStamp: $2/$3/$1" inFile > outFile && printf '%s\n' inFile 

При обработке весь каталог, в простой и POSIX-совместимых - но неэффективно - подход для обработки файлов в цикле:

for f in *; do 
    [ -f "$f" ] || continue # skip non-files or break, if dir. is empty 
    egrep "TimeStamp: $2/$3/$1" "$f" >> outFile && printf '%s\n' "$f" 
done 

Если вы используете bash и GNUgrep или BSDgrep (также используется на OSX), есть более эффективный решение:

egrep -sH "TimeStamp: $2/$3/$1" * | 
    tee >(cut -d: -f1 | sort -u > outFilenames) | 
    cut -d: -f2- > outFile 
  • Поскольку * потенциально также соответствует директории, -s подавляет сообщение об ошибке, вытекающем из (неизменно неудачи) пытается обработать их как файлов.
  • -H гарантирует, что каждый соответствующий линии с префиксом входного файла с последующим :
  • tee >(...) ... посылает входной сигнал в стандартный вывод, так и внутри команды >(...).
  • cut -d: -f1 | sort -u извлекает совпадающие имена файлов из строк результатов, создает отсортированный список без дубликатов из них и отправляет их в файл outFilenames.
  • cut -d: -f2- затем извлекает соответствующие строки (лишенные префикса имени файла) и фиксирует их в файле outFile.
1
grep -l 

Разъяснение

 
-l, --files-with-matches 
    Suppress normal output; instead print the name of each input file from which 
    output would normally have been printed. The scanning will stop on the first 
    match. (-l is specified by POSIX.) 

Source

Смежные вопросы