Содержит ли $SHELLVAR
пробел?Если это так, ваш сценарий awk неправильно обрабатывается, и предполагается, что {print awkvar}
является именем файла, а не самой программой AWK.
У вас также есть проблема, когда оба значения для loop и программа awk оба портят STDIN.Фактически, ваш цикл for будет выполняться только один раз, поскольку AWK будет считывать все STDIN до тех пор, пока он не завершится.В конце концов, вы будете получать одну и ту же строку снова и снова, а затем ваша программа перестанет работать, так как awk
ожидает большего количества STDIN.
Я думаю, вы хотите сделать что-то подобное ...
find . -name "R*VER" -mtime +1 | while read myfile
do
echo "$SHELLVAR" | awk '{print $0}'
done
Таким образом, ваша команда echo поступает в ваш awk, что предотвращает чтение awk из оператора find.
В целом, вам лучше сделать следующее:
find . -name "R*VER" -mtime +1 | while read myfile
do
...
done
Вместо этого:
for myfile in `find . -name "R*VER" -mtime +1`
do
...
done
Это по нескольким причинам:
Буфер командной строки может переполниться, и вы потеряетеимена файлов, но вы никогда не увидите ошибку.
Команда поиска во втором примере должна сначала завершиться, прежде чем цикл for сможет начать выполняться.В первом примере поиск находит в цикле while.
ADDENDUM
Теперь, когда я увидел just-my-correct-мнения *Ответ 1039 *, я понимаю, что вы действительно сделали неправильно: вы забыли имя файла в команде awk
:
find . -name "R*VER" -mtime +1 | while read myfile
do
SHELLVAR=`grep ^err $myfile || echo "No error"`
awk -v awkvar=${SHELLVAR} '{print awkvar}' $myfile
done
Теперь вопрос в том, что именно вы делаете с awk
.Вы не печатаете ничего, кроме значения $SHELVAR
для каждой строки в файле.Это, вероятно, не то, что вы хотите сделать.На самом деле, почему бы просто не сделать это:
find . -name "R*VER" -mtime +1 | while read myfile
do
SHELLVAR=$(grep -q "^err" $myfile")
if [ "x$SHELLVAR" != "x" ]
then
echo "$SHELLVAR"
fi
done
Таким образом, вы распечатаете $SHELLVAR
, но только если $SHELLVAR
пусто.
Или вы можете использовать awk длявыведите только те строки, которые соответствуют вашему регулярному выражению:
find . -name "R*VER" -mtime +1 | while read myfile
do
awk '/^err/ {print $0}' $myfile
done