Решено:
это была "фича" в lpd. По умолчанию lpd печатает «баннер» и создает 2 файла спула -. Первый файл спула был распечатан, но это только баннер, а второй файл был проигнорирован cups -pdf.
Пришлось отключить баннер в xinetd.conf
server_args = -o document-format=application/octet-stream -o job-sheets=none,none
Это решило мою проблему.
напишите свой первый скрипт:
awk 'IGNORECASE = 1;/bingo/ && /number/;'
ваш код awk эквивалентен:
awk '(IGNORECASE = 1){print}; (/bingo/ && /number/){print}'
поэтому он будет выполнять -нечувствительное к регистру соответствие в GNU awk, но не в других awks, и всегда будет печатать текущую строку (, поскольку присваивание IGNORECASE=1
оценивается как 1
, что является истинным условием. )и тогда любая строка, содержащая и бинго, и число, будет напечатана во второй раз.
напишите свой второй скрипт:
awk 'tolower($0) ~ /(?=.*bingo)(?=.*number)/'
Этот материал ?=
относится к поиску по PCRE -awk поддерживает ERE, а не PCRE, так что мне придется подумать о том, что это на самом деле означает в ERE, но что бы это ни было, это не то, что вы хотели. иметь в виду.
Что касается вашего утверждения, что:
It seems that awk may be performing the match against the lines in each file in the output of ls -R
Не знаю, почему вы так думаете, но нет, это не так.
Вот что, я думаю, вам нужно в GNU awk:
awk 'BEGIN{IGNORECASE=1}; /bingo/ && /number/'
Или:
awk -v IGNORECASE=1 '/bingo/ && /number/'
и в любом awk:
awk '{lc=tolower($0)}; (lc ~ /bingo/) && (lc ~ /number/)'
Если вы хотите найти имена в текущем каталоге или ниже, которые содержат строки bingo
и number
, в любом случае вы не должны передавать вывод ls -R
через awk
, а вместо этого использоватьfind
:
find. -iname '*bingo*' -iname '*number*'
Предикат -iname
не является стандартным -, но обычно реализуется и нечувствительно сопоставляет имя просматриваемого в данный момент файла с заданным регистром шаблона подстановки -.
Если вы хотите получить имя файла только , а не полный путь к найденным файлам, используйте
find. -iname '*bingo*' -iname '*number*' -exec basename {} \;
С GNU find
вы можете использовать
find. -iname '*bingo*' -iname '*number*' -printf '%f\n'
, что будет быстрее, чем использование basename
.
Если вы знаете, что порядок двух слов таков: «bingo
, за которым следует number
», используйте -iname '*bingo*number*'
с find
вместо двух -iname
тестов.
Если вы знаете, что это именно тот порядок слов, который вы хотите найти, вы также можете использовать bash
напрямую:
shopt -s globstar # enable ** to match across / in pathnames
shopt -s nocaseglob # enable case-insensitive globbing
shopt -s failglob # error when a pattern does not match anything
printf '%s\n' **/*bingo*number*
Чтобы получить часть пути к имени файла:
shopt -s globstar nocaseglob failglob
for name in **/*bingo*number*; do
basename -- "$name"
done
или, если у вас есть GNU basename
и вы не ожидаете когда-либо сопоставить тысячи файлов,
shopt -s globstar nocaseglob failglob
basename -a -- **/*bingo*number*
где -a
указывает утилите отображать часть имени файла каждого аргумента (несколько аргументов ).
Стефан указывает в комментариях, что игнорировать порядок двух подстрок, например, в. bash
, вы можете использовать расширенный шаблон подстановки
!(!(*bingo*)|!(*number*))
Это работает путем сопоставления всех имен, кроме имен, которые не содержат ни одной из двух строк.Таким образом, вы получите
shopt -s globstar nocaseglob failglob
shopt -s extglob # for extended globbing patterns in bash
for name in **/!(!(*bingo*)|!(*number*)); do
basename -- "$name"
done
Связанные: