linux 如何仅在找到第一个图案的文件中搜索第二个图案-两个图案都已打印

nvbavucw  于 2023-06-21  发布在  Linux
关注(0)|答案(1)|浏览(112)

我有一堆最初从模板创建的文件。这意味着我知道提到的标签存在于所有这些文件中!(我希望艾德也是好的!)
我在这里分享这个案例时已经简化了原始文件。只有四个文件,每个文件有两个参数/标签。

$ cat file1.tt file2.tt file3.tt file4.tt
#region owner
// kalle
#endregion
#region status
// open
#endregion
#
#region owner
// berra
#endregion
#region status
// Open
#endregion
#
#region owner
// sune
#endregion
#region status
// test
#endregion
#
#region owner
// sixten
#endregion
#region status
// analyze
#endregion`

a)我想做的第一件事是找到所有具有标签“状态”值而非“打开”或“打开”的文件。我希望打印输出显示文件名和实际状态。
这是我已经拥有的东西。(下文进一步介绍)
B)但我还想看到在上面的“a”中找到的文件的标签“owner”。该结果可以打印在“a”中的“status”信息之后的行上。像这样的东西会很棒,

file3.tt-// test // sune
file4.tt-// analyze // sixten`

我有一个命令来打印所有文件的“owner”标记值。但不是我根据上面要求的解决方案。
打印输出格式并不重要,只要每个文件的信息被很好地分开即可:这两个标记也可以打印在文件名后面的单独行上。然后在下一个文件名前显示一个空行。等等...
到目前为止,我可以很容易地得到我想在“一”与此:

grep -rA1 --include='*.tt' '#region status' | grep -v '#region status' | grep 'tt' | grep -v --ignore-case open

file3.tt-// test
file4.tt-// analyze

对于“B”,我有这个命令。但这将为所有文件打印“所有者”。

grep -rA1 --include='*.tt' '#region owner' . | grep -v '#region owner'

./file1.tt-// kalle
./file2.tt-// berra
./file3.tt-// sune
./file4.tt-// sixten

但我想要的是a和b的组合只是为了打印在“a”中找到的文件的“所有者”。因此,只有当“status”标签与“open”/“Open”不同时,才应打印文件名以及“status”和“owner”。
一行字是我期待看到的。
谢谢

dffbzjpn

dffbzjpn1#

grep -v打印不匹配模式的 * 行 *,但不排除整个文件。
使用带有if的循环来测试文件是否包含open。然后,您可以使用sed打印#region owner之后的行。

for file in *.tt; do
    status=$(sed -n '/#region status/{n;p;q}' "$file" | tr '[:upper:]' '[:lower:]')
    if [[ $status != *open ]]
    then
        owner=$(sed -n '/#region owner/{n;p;q}' "$file")
        printf '%s-%s-%s\n' "$file" "$owner" "$status"
    fi
done

相关问题