【问题标题】:BASH output from grep来自 grep 的 BASH 输出
【发布时间】:2018-07-18 08:58:46
【问题描述】:

我对 bash 比较陌生,我正在针对第一种情况测试我的代码。

counter=1
for file in not_processed/*.txt; do
  if [ $counter -le 1 ]; then
    grep -v '2018-07' $file > bis.txt;
    counter=$(($counter+1));
  fi;
done

我想从我的文件中减去所有包含“2018-07”的行。新文件需要命名为 $file_bis.txt。

谢谢

【问题讨论】:

  • 你可以在linux中使用sed命令来达到这个目的
  • @JPV,在此处添加两个示例文件以及预期的输出和文件名会有所帮助.. grep -v 与您的文本 subtract 匹配,但您已经接受了相反的答案.. 还有,不知道你为什么在你的脚本中使用counter

标签: bash grep stdout


【解决方案1】:

使用sedawk 可以更轻松、更快速地处理复杂文件。

sed -n '/2018-07/p' not_processed/*.txt

然后您会在控制台中获得输出。如果您愿意,可以将输出通过管道传输到新文件。

sed -n '/2018-07/p' not_processed/*.txt >> out.txt

【讨论】:

  • 但是我想将pipie放到不同的文件中。
  • 这不是你的例子。您将所有内容通过管道传输到同一个文件并覆盖它。
  • easier and faster 取决于用例。grep 在这里会更快,也更紧凑。grep '2018-07'
  • 那是我的错误。但是你能告诉我吗?
【解决方案2】:

这是对 not_processed/*.txt 中的所有文件执行此操作

for file in not_processed/*.txt
do
  grep -v '2018-07' $file > "$file"_bis.txt
done

这是仅对 not_processed/*.txt 中的前 2 个文件执行此操作

for file in $(ls not_processed/*.txt|head -2)
do
  grep -v '2018-07' $file > "$file"_bis.txt
done

不要忘记在 $file 上添加 "",否则 bash 会将 $file_bis 视为一个新变量,它没有赋值。

【讨论】:

    【解决方案3】:

    我不明白您为什么要使用计数器和if 条件来满足这个简单的要求。使用以下脚本将满足您的要求:-

    #first store all the files in a variable
    files=$(ls /your/path/*.txt)
    # now use a for loop
    for file in $files;
    do
      grep '2018-07' $file >> bis.txt
    done
    

    这里最好避免for循环,因为下面一行就足够了

    grep -h '2018-07' /your/path/*.txt >  bis.txt
    

    【讨论】:

    • 不要使用 ls 输出,如果文件名包含空格、换行符等,它将不起作用...不需要将结果保存在变量中,当您可以可靠地使用 for file in /your/path/*.txt 时......和当你可以做grep '2018-07' /your/path/*.txt时不需要循环(除非文件太多)
    • @Sundeep,你说的很对。我刚刚修改了他的for loop。我已根据您的建议修改了我的答案。感谢您的评论和建议。
    • grep xxx file1 file2 将把 "file1:" 或 "file2:" 放在匹配行的开头,而 grep xxx file1 默认不会。使用-H 选项强制将名称添加到输出行,或使用-h 隐藏名称。
    • @simon3270,感谢您的建议,我已经修改了答案。
    猜你喜欢
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多