У меня есть 3 файла в каталоге: xyz1.txt
, xyz2.txt
, rst_xyz.txt
и я хочу работать ТОЛЬКО с первыми двумя (те, которые начинаются с xyz). Команда ls | awk '/xyz/{print $1}'
вернет все три из них. Какие изменения я могу внести в команду, чтобы указать ТОЛЬКО файлы xyz *? Я пробовал ls | awk '/^xyz/{print $1}'
полагая, что файл должен начинаться с xyz, но это не исключает rst_xyz.txt
.
3 ответа
Ты хочешь
awk '...' xyz*
Если по какой-то очень странной причине вы хотите сделать это полностью в awk:
awk 'FILENAME ~ /^xyz/ { .... }' *
нет необходимости в awk. просто используйте имя файла glob:
ls xyz*
Скорее всего, вы захотите передать имена файлов для работы с ними? как это может быть?
ls xyz* | some other commands
в этом случае лучше использовать цикл for.
for filename in xyz*
do
some other commands "$filename"
done
обратите внимание, что в первом варианте имена файлов будут поступать в виде потока в stdin some other commands
тогда как в цикле for имена файлов будут приходить один за другим в качестве аргумента командной строки для some other command
.
ls | awk '/^xyz/'
Ваше первоначальное решение просто пропустило ^
в регулярном выражении, которое привязывает совпадение к началу строки. Вам не нужен блок print
потому что при поиске совпадения по умолчанию выполняется печать строки. Если вы хотите быть явным, вы можете написать:
ls | awk '/^xyz/ {print $0}'
Вы должны использовать $0
а не $1
если имя файла содержит пробелы (хотя, если имя файла содержит символ новой строки, это все равно будет восприниматься как несколько имен).