Как получить термин из S3 и вывести имя объекта

Мне нужно найти термин для тысяч файлов в S3 и перечислить имена этих файлов в каком-то выходном файле. Я новичок в использовании cli, поэтому я тестировал как на своем локальном, так и на небольшом подмножестве в s3.

Пока у меня есть это:

aws s3 cp s3://mybucket/path/to/file.csv - | grep -iln searchterm > output.txt

Проблема с этим с дефисом. Поскольку я копирую на стандартный вывод, переключатель -l в grep возвращает (стандартный ввод) вместо file.csv

Мой желаемый результат

file.csv

В конце концов, мне нужно повторить это для всего сегмента, а затем для всех сегментов, чтобы получить

file1.csv
file2.csv
file3.csv

Но сначала мне нужно преодолеть это препятствие. Спасибо!


person twalrus    schedule 09.03.2017    source источник


Ответы (1)


Поскольку вы печатаете файл в STDOUT и передаете его в grep STDIN, grep не знает, что исходный файл был file.csv. Если у вас длинный список файлов, я бы сделал:

while read -r file; do aws s3 cp s3://mybucket/path/to/${file} - | grep -q searchterm && { echo ${file} >> output.txt; }; done < files_list.txt

Я не могу попробовать, потому что у меня нет доступа к экземпляру AWS S3, но хитрость заключается в том, чтобы использовать grep тихо (-q), он вернет true, если найдет хотя бы совпадение, иначе false; Затем вы можете распечатать имя файла.

РЕДАКТИРОВАТЬ: Объяснение

  1. Цикл while будет перебирать каждую строку files_list.txt
  2. Команда aws напечатает этот файл в stdout
  3. Мы перенаправляем stdout в grep в тихом режиме (-q), который действует как средство сопоставления с образцом, возвращая true, если совпадение было найдено, или false, в противном случае.
  4. Если grep возвращает true, мы добавляем имя файла (${file}) к нашему выходному файлу.

EDIT2: другое решение

while read -r file; do aws s3 cp s3://mybucket/path/to/${file} - | sed -n /searchpattern/{F;q} >> output.txt; done < files_list.txt

Объяснение

Шаги 1 и 2 одинаковы, тогда:

  1. stdout перенаправляется на sed, который будет просматривать файл построчно, пока не найдет первый stream pattern, а затем выйти (q), печатая имя файла (F) в выходном файле.
person jraynal    schedule 10.03.2017
comment
Спасибо. Можете ли вы пройтись по нему и объяснить, почему каждый элемент заставляет его работать? - person twalrus; 15.03.2017
comment
Готово, надеюсь, вам будет полезно мое объяснение! Я также добавил еще одно решение, которое я недавно узнал, используя sed. - person jraynal; 15.03.2017