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


10

我有一个日志文件,我想在其中搜索字符串,并且仅当找到该字符串时才创建一个新文件。sed doenst在这种情况下似乎很合适,该如何实现呢?


3
使用grep搜索。该-q选项将禁止所有输出,并通过grep退出代码返回匹配/不匹配,这很容易测试。
waltinator

2
告诉我们这种情况是有帮助的。
j0h

Answers:


16

grep以下情况下进行短路评估:

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

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


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

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


:怎么办?
George Udosen

5
@George :是的简写true,它是一个无操作命令,总是以退出状态0退出
。– heemayl

@heemayl直到今天为止效果最好
Jacknife

6

只是为了好玩:

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

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


4

您可以在其system()命令中使用awk 。如果/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 

0

您无需说是要一个新的空文件,还是需要进行更复杂的处理来创建该文件。

如果是前者,则@heemayl的回复很明显。

否则,请使用if语句:

if grep -q 'search_pattern' /file
then
    # Create your file here
fi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.