читать файл через конвейер

 awk '/pattern/{print FILENAME}; {nextfile}' ./*.txt

будет печатать имена не скрытых файлов txt в текущем каталоге, первая строка которого соответствует расширенному регулярному выражению шаблону с теми awk реализациями, которые поддерживают nextfile .

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

 awk 'FNR == 1 && ! /pattern/ {nextfile}; {print}' ./*.txt

Это эффективно, поскольку выполняется только одна команда, но awk не самый эффективный команда для дампа содержимого файла с большими файлами, вы могли бы получить лучшую производительность, выполнив что-то вроде:

 awk '/pattern/{printf "%s\0", FILENAME}; {nextfile}' ./*.txt |
   xargs -r0 cat

То есть, используйте только awk для печати списка файлов, которые соответствуют (0- с разделителями) и полагаться на cat для сброса их содержимого.

0
12.03.2018, 17:25
1 ответ
#!/bin/sh

infile=${1--}

cat "$infile"

То есть установите для переменной infileимя первого аргумента, но если оно недоступно, установите для него значение -. catс -в качестве имени входного файла будет считываться из стандартного ввода (, то есть из канала или перенаправления ).


Короче:

#!/bin/sh

cat -- "${1--}"

или, как указывает Стефан,

cat -- "$@"

, что дополнительно позволит вам указать несколько имен файлов в командной строке.


Еще короче:

alias PipeTester=cat

То, что вы делаете, является более или менее повторной реализацией cat. Ваш сценарий PipeTesterна самом деле может быть заменен на cat, и вышеприведенное делает это с помощью псевдонима.

4
28.01.2020, 02:18

Теги

Похожие вопросы