Как передать параметр из сравнения bash и string в awk? - PullRequest
0 голосов
/ 11 октября 2011

Как передать параметр в awk для сравнения строки с вводом канала? Например, для фильтрации файлов, созданных до августа 2011 года в определенной папке

, используются следующие элементы.
#!/bin/bash
$FILTER_DIR=$1

# file date before it should be listed.
FILTER_BEFORE="2011-08"

# $6 in awk statement is date of file name($8)
find $1 -type f | \
    sed 's/^/ls -l /g' | \
    sh | \
    awk ' if ( $6 le $FILTER_BEFORE ) { print $8 }'

В результате отобразятся все файлы в $ FILER_DIR без фильтрации. Похоже, AWK не получил $ FILTER_BEFORE от bash должным образом. Любой комментарий приветствуется !!

Ответы [ 4 ]

4 голосов
/ 11 октября 2011

если используется gawk, передайте его в качестве параметра

find $1 -type f | 
sed 's/^/ls -l /g' | 
sh | 
awk -v filter_before=${FILTER_BEFORE} '{ if ( $6 <= filter_before ) { print $8 } }'
2 голосов
/ 11 октября 2011

Вам нужно будет использовать двойные кавычки и экранировать другие переменные AWK, чтобы они не интерпретировались bash.

find $1 -type f | \
    sed 's/^/ls -l /g' | \
    sh | \
    awk " if ( \$6 le \"$FILTER_BEFORE\" ) { print \$8 }"

В качестве альтернативы вы можете разбить только переменную на двойные кавычки, чтобы избежать экранирования.

find $1 -type f | \
    sed 's/^/ls -l /g' | \
    sh | \
    awk ' if ( $6 le "'"$FILTER_BEFORE"'" ) { print $8 }'
1 голос
/ 11 октября 2011

Я бы выбрал:

touch -t 201107302359 30_july_2011
find . -type f ! -newer 30_july_2011 

Или вот это ( GNU find only):

find . -type f ! -newermt '2011-07-30 23:59' 
0 голосов
/ 12 октября 2011

Следующие утверждения кажутся правильными. Спасибо всем за помощь.

find $1 -type f | \ 
sed 's/^/ls -l /g' | \ 
sh | \ 
awk -v filter_before=${FILTER_BEFORE} '{ if ( $6 < filter_before ) { print $8 } }'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...