Перебирая файлы, сохраните последнюю строку файла и имя файла в текстовом файле через STDOUT и pipe - PullRequest
1 голос
/ 28 января 2011

вчера я задал вопрос как сохранить вывод консоли в файл (см. перенаправить только последнюю строку STDOUT в файл ).Теперь я перебираю файлы, собираю их.Вот моя команда:

for REPORT in Test_Basic_*.scala; do
    scalac -Xplugin:divbyzero.jar $REPORT | awk 'END{print $REPORT} END{print}' >> output.txt
done

Я хочу сохранить последний вывод компиляции и имя файла.В приведенном выше примере будет сохранен только $ REPORT, но я хочу сослаться на имя переменной итерации.

Например, у меня есть файл Test_Condition.scala и я запускаю указанную выше команду:

for REPORT in Test_Basic_*.scala; do
    scalac -Xplugin:divbyzero.jar $REPORT | awk 'END{print $REPORT} END{print}' >> output.txt;
done

Затем scalac -Xplugin:divbyzero.jar $REPORT выдаст следующий вывод:

You have overwritten the standard meaning
Literal:()
rhs type: Int(1)
Constant Type: Constant(1)
We have a literal constant
List(localhost.Low)
Constant Type: Constant(1)
Literal:1
rhs type: Int(2)
Constant Type: Constant(2)
We have a literal constant
List(localhost.High)
Constant Type: Constant(2)
Literal:2
rhs type: Boolean(true)
Constant Type: Constant(true)
We have a literal constant
List(localhost.High)
Constant Type: Constant(true)
Literal:true
LEVEL: H
LEVEL: H
okay
LEVEL: H
okay
false
symboltable: Map(a -> 219 | Int | object TestIfConditionWithElseAccept2 | normalTermination | L, c -> 221 | Boolean | object TestIfConditionWithElseAccept2 | normalTermination | H, b -> 220 | Int | object TestIfConditionWithElseAccept2 | normalTermination | H)
pc: Set(L, H)

Теперь я хочу сохранить в output.txt Test_Condition.scala (имя файла) и pc: Set(L, H) (поэтому последняя строкавывод компиляции).С моей командой выше я сохраняю только $REPORT pc: Set(L, H).

Если это объяснение слишком сложное, просто скажите мне.Спасибо за вашу большую поддержку.

Матиас

Ответы [ 2 ]

2 голосов
/ 28 января 2011

Вы получаете только литерал "$ REPORT", потому что ваш скрипт awk заключен в одинарные кавычки, что предотвращает подстановку оболочки переменной REPORT.

Попробуйте это:

scalac ... "$REPORT" | awk -v filename="$REPORT" 'END {print filename; print}' >> output

Опция -v устанавливает переменную awk с именем filename для хранения значения переменной REPORT оболочки.

Кроме того, рекомендуется всегда заключать в кавычки переменные оболочки (если вы специально не указали)хочу побочные эффекты от их пропуска).

1 голос
/ 28 января 2011

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

: > output # clear out the output file
for file in Test_Basic_*.scala; do
  printf "$file: " >> output
  scalac ... | awk 'END { print }' >> output
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...