搜索文件并仅在满足条件时创建新文件

搜索文件并仅在满足条件时创建新文件

我有一个日志文件,我想在其中搜索一个字符串,只有找到该字符串时才创建一个新文件。我该如何实现这一点,sed 似乎不适合这种情况。

答案1

进行短路评估后grep

grep -q 'search_pattern' /file && : >/newfile
  • grep -q0不会在 STDOUT 上产生输出,如果在文件中找到模式,则仅以退出状态退出

  • 如果找到模式(&&),/newfile则通过创建一个文件: >/newfile


您也可以采用通常的touch /newfile方法,或者bash,使用空重定向 -->/newfile也可以。

需要注意的是,如果文件已经存在,则touch只会更改相关时间戳而不会截断文件。并且>/newfile并非所有 shell 都支持空重定向(例如,在 中zsh),您必须手动发送 EOF。

答案2

只是为了好玩:

python3 -c "if 'string' in open('logfile').read(): open('newfile', 'wt')"

其中,'string'由字符串(条件)替换,'logfile'由日志文件的路径替换,'newfile'由要创建的文件的实际路径替换,全部用单引号引起来,就像示例中那样。

答案3

您可以使用 awk 及其system()命令。如果找到,则将执行/pattern/代码块,在本例中我们通过命令调用。{}touch /tmp/my_file.txtsystem()

下面的示例显示如果有我的用户存在则创建一个临时文件/etc/passwd

$ awk '/xieerqi/{system("touch /tmp/my_file.txt")}' /etc/passwd

$ ls -l /tmp/my_file.txt
-rw-rw-r-- 1 xieerqi xieerqi 0 1月  25 07:58 /tmp/my_file.txt

或者,我们可以使用重定向到文件:

 awk '/xieerqi/{f="/tmp/my_file.txt";print "" > f;close(f)}' /etc/passwd 

答案4

您没有说是否想要一个新的空文件,或者是否需要更复杂的处理来创建该文件。

如果是前者,那么@heemayl 的回复是正确的。

否则,使用 if 语句:

if grep -q 'search_pattern' /file
then
    # Create your file here
fi

相关内容