我必须在给定文件中的特定字符串旁边输出特定值。我可以结合使用 grep 和 awk 来做到这一点。
问题是我还必须同时输出文件名
file1= value1
file2= value2
等等。我无法同时打印文件名和值。
我试过
for i in $(ls -d */);
do
cd ${i%%/};
printf '%s\n' "${i%%/}" >> ../final
grep -R "Syntax" ${i%%/}.log | awk '{print $8}' >> ../final ;
cd ../
done
在这种情况下,输出为
file name1
value1
file name2
value2
我希望他们在同一条线上。
试试这个 Shellcheck-干净的代码:
#! /bin/bash -p
shopt -s nullglob
for dir_ in */; do
dir=${dir_%/}
printf '%s=' "$dir"
awk '/Syntax/{print $8}' "$dir/$dir.log"
done > final
shopt nullglob
使 glob(例如 */
)在没有匹配项时扩展为空(否则它们扩展为 glob 模式本身,这在程序中几乎从来没有用过)。ls
专为交互式使用而设计。在程序中使用它有一些陷阱(例如 Bash 陷阱 #1(对于 $(ls *.mp3) 中的 f)),最好避免它。cd
相关的陷阱(例如Bash Pitfalls #19 (cd /foo; bar))。避免使用它是最好的,而且通常很容易。printf
默认情况下不打印换行符,因此您可以通过不使用 \n
(换行符)和 printf
作为第一行来将两个输出放在一行上。