我有一个日志文件,我想在其中搜索一个字符串,只有找到该字符串时才创建一个新文件。我该如何实现这一点,sed 似乎不适合这种情况。
答案1
进行短路评估后grep
:
grep -q 'search_pattern' /file && : >/newfile
grep -q
0
不会在 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.txt
system()
下面的示例显示如果有我的用户存在则创建一个临时文件/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