【问题标题】:Print all file names and append 1 to each name if there is a particular string else append 0打印所有文件名,如果有特定字符串,则在每个名称后附加 1,否则附加 0
【发布时间】:2021-02-26 05:57:58
【问题描述】:

我在一个文件夹中有多个文件,我想扫描每个文件的内容以检查字符串,例如“abc”(区分大小写)。我想输出文件名以及带有 1 或 0 等标签的字符串,以判断字符串是否存在。例如。如果有文件

A1
A2
B3
B5
C8
Z7

并且只有 B3 和 C8 包含 "abc" 。输出应该如下

A1 abc 0
A2 abc 0
B3 abc 1
B5 abc 0
C8 abc 1
Z7 abc 0

所有这些都应该打印到"output.txt" 文件中。

我的代码似乎可以工作:

#!/bin/bash
touch output.txt
for f in * ; 
do echo ${f} ;
 echo "abc" ;
 grep -w "abc" ${f}| wc -l ;
done

输出是这样的

A1 
abc 
0
A2 
abc 
0
B3 
abc 
1
B5 
abc 
0
C8 
abc 
1
Z7 
abc 
0

但是,我无法将它们打印到 txt 文件中,也无法按照我想要的顺序进行。请多多指教。

编辑:我 cd 进入包含文件的目录,txt 文件位于外部根目录中。

编辑 2:这与 "echo -n" prints "-n" 不同 因为,我想使用 grep 打印出文件名,同时根据特定字符串的存在/不存在添加标签

【问题讨论】:

  • 你是什么意思按我想要的顺序?您的程序的输出似乎是有序的。
  • 这能回答你的问题吗? 'echo' without newline in a shell script
  • @oguz ismail :即使它是有序的,我也无法将输出打印到 txt 文件中
  • 是的,你需要done > output.txt。虽然我更喜欢下面发布的 awk 程序 Tripleee。

标签: linux bash grep


【解决方案1】:

我会这样做:

word=abc
for f in *
do
  grep -vqswF "$word" "$f"
  label=$?
  echo "$f $word $label"
done

-v 使 grep 的退出码在该单词不在文件中时为 1,如果在文件中则为 0。 -q 确保 grep 不会向标准输出输出任何内容。在我的示例中,我还使用了-s,它可以抑制来自不可读文件的错误消息。您不必使用它,但这样的错误会出现在退出代码中(在这种情况下通常为 2)。 -F 确保如果您将单词设置为包含 grep 特殊字符的内容,您的代码仍然可以工作。

【讨论】:

    【解决方案2】:

    使用 GNU grepsed 的单线:

    grep -m1 -cw abc * | sed -E 's/:(.)$/ abc \1/'
    

    【讨论】:

    • 巧妙地将-m1-c 结合起来!
    【解决方案3】:

    如果您只有一个字符串,grep -l 可以通过一些后处理完成您想要的操作,但最直接的解决方案是 Awk。

    awk -v str="abc" 'FNR == 1 {
        if (!p) print f, str, 0; f = FILENAME; p=0 }
    0 ~ str { print f, str, 1; p = 1; nextfile }
    END { if (!p) print f, str, 0 }' * >output.txt
    

    回想一下,Awk 处理每个输入行的整个脚本并评估条件。 FNR,输入行号,当你开始处理一个新文件时,我们检查是否有来自前一个文件的数据需要打印,然后为当前文件初始化几个变量。如果我们看到搜索字符串,我们打印并关闭当前文件。当我们到达所有文件的末尾时,再次检查最后一个文件中的某些内容是否仍需要打印。

    【讨论】:

      【解决方案4】:

      您可以使用findgrep

      find -maxdepth 1 -type f  -printf "%p abc " \
           -exec grep -q abc {} \; -printf "1\n" -o -printf "0\n"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-22
        • 2021-03-21
        • 2021-10-25
        相关资源
        最近更新 更多