grep и awk, объединить команды? - PullRequest
2 голосов
/ 17 июня 2019

У меня есть файл, который выглядит как:

This is a RESTRICTED site.
All connections are monitored and recorded.
Disconnect IMMEDIATELY if you are not an authorized user!
sftp> cd outbox
sftp> ls -ltr
-rw-------   1 0        0            1911 Jun 12 20:40 61N0584832_EDIP000749728818_MFC_20190612203409.txt
-rw-------   1 0        0            1878 Jun 13 06:01 613577165_EDIP000750181517_MFC_20190613055207.txt

Я хочу напечатать только имена файлов .txt, в идеале, одной командой.

Я могу сделать:

grep -e '^-' outfile.log > outfile.log2

.. который дает только те строки, которые начинаются с '-'.

-rw-------   1 0        0            1911 Jun 12 20:40 61N0584832_EDIP000749728818_MFC_20190612203409.txt
-rw-------   1 0        0            1878 Jun 13 06:01 613577165_EDIP000750181517_MFC_20190613055207.txt

А потом:

awk '{print $9}' outfile.log2 > outfile.log3

.. что дает желаемый результат:

61N0584832_EDIP000749728818_MFC_20190612203409.txt
613577165_EDIP000750181517_MFC_20190613055207.txt

И поэтому вопрос в том, можно ли объединить эти 2 команды в 1?

Ответы [ 4 ]

7 голосов
/ 17 июня 2019

Вы можете использовать один awk:

awk '/^-/{ print $9 }' file > outputfile

Или

awk '/^-/{ print $9 }' file > tmp && mv tmp file

Работает так:

  • /^-/ - находиткаждая строка, начинающаяся с -
  • { print $9 } - печатает только поле 9 совпадающих строк.
3 голосов
/ 17 июня 2019

Похоже на совпадение с ведущим - не совсем то, что вы хотите.Если вы хотите просто получить .txt файлы в качестве выходных данных, отфильтруйте по имени файла:

awk '$9 ~ /\.txt$/{print $9}' input-file
1 голос
/ 17 июня 2019

Использование grep с включенным PCRE (-P) флаг:

grep -oP '^-.* \K.*' outfile.log 
61N0584832_EDIP000749728818_MFC_20190612203409.txt
613577165_EDIP000750181517_MFC_20190613055207.txt

'^-.* \K.*': Строка, начинающаяся с - до последнего пробела, сопоставляется, но игнорируется (все, что осталось от\K будет сопоставлено и проигнорировано), а соответствующая часть справа от \K будет напечатана.

0 голосов
/ 18 июня 2019

Поскольку он ясно пишет I want to print only the .txt file names, мы должны проверить текстовый файл, и поскольку имя файла всегда является последним столбцом, мы делаем его более переносимым, проверяя только последнюю строку файла:

awk '$NF ~ /\.txt$/{print $NF}' outfile.log > outfile.log2
61N0584832_EDIP000749728818_MFC_20190612203409.txt
613577165_EDIP000750181517_MFC_20190613055207.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...