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
для сброса их содержимого.
#!/bin/sh
infile=${1--}
cat "$infile"
То есть установите для переменной infile
имя первого аргумента, но если оно недоступно, установите для него значение -
. cat
с -
в качестве имени входного файла будет считываться из стандартного ввода (, то есть из канала или перенаправления ).
Короче:
#!/bin/sh
cat -- "${1--}"
или, как указывает Стефан,
cat -- "$@"
, что дополнительно позволит вам указать несколько имен файлов в командной строке.
Еще короче:
alias PipeTester=cat
То, что вы делаете, является более или менее повторной реализацией cat
. Ваш сценарий PipeTester
на самом деле может быть заменен на cat
, и вышеприведенное делает это с помощью псевдонима.