如何在 Bash for 循环中的同一行上打印多个值?

问题描述 投票:0回答:1

我必须在给定文件中的特定字符串旁边输出特定值。我可以结合使用 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

我希望他们在同一条线上。

bash variables awk grep
1个回答
0
投票

试试这个 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
    作为第一行来将两个输出放在一行上。
© www.soinside.com 2019 - 2024. All rights reserved.