У меня есть 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 ответа3

2

Не ls !

Ты хочешь

awk '...' xyz*

Если по какой-то очень странной причине вы хотите сделать это полностью в awk:

awk 'FILENAME ~ /^xyz/ { .... }' *
1

нет необходимости в 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 .

1
ls | awk '/^xyz/'

Ваше первоначальное решение просто пропустило ^ в регулярном выражении, которое привязывает совпадение к началу строки. Вам не нужен блок print потому что при поиске совпадения по умолчанию выполняется печать строки. Если вы хотите быть явным, вы можете написать:

ls | awk '/^xyz/ {print $0}'

Вы должны использовать $0 а не $1 если имя файла содержит пробелы (хотя, если имя файла содержит символ новой строки, это все равно будет восприниматься как несколько имен).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .