grep 字符串从 1 到特定行

grep 字符串从 1 到特定行

我正在 Linux 上工作,并且正在运行以下命令:

$ ls -t postgresq*.log | head -n1 | xargs grep "ALTER USER"  
< pg_user 2021-07-15 05:03:41.609 EDT > LOG:  statement: ALTER USER username WITH ENCRYPTED PASSWORD 'JUly@#12' valid until '2021-07-20';

但我只想 grep 下面的字符串:

ALTER USER username WITH ENCRYPTED PASSWORD 'JUly@#12' valid until '2021-07-20';

答案1

只需使用-o(来自man grep):

$ man grep | grep -P -A1 -- '^\s+-o'
       -o, --only-matching
              Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line.

由于-o只会grep打印该行的匹配部分,因此您只需搜索即可ALTER USER.*匹配从ALTER USER到末尾的所有内容:

$ ls -t postgresq*.log | head -n1 | xargs grep -oP 'ALTER USER.*'
ALTER USER username WITH ENCRYPTED PASSWORD 'JUly@#12' valid until '2021-07-20';

注意解析输出ls通常不是一个好主意,但对于您的情况来说可能是安全的,因为这些日志文件应该具有简单的名称。

答案2

使用zshshellsed查找并修改您要查找的行:

sed '/ALTER USER/ s/.*statement: //' postgresq*.log(.om[1])

通配模式postgresq*.log(.om[1])在中进行了一些详细解释我的答案你之前的问题。简而言之,它扩展为名称与模式匹配的最近修改的常规文件的名称postgresq*.log,或者如果没有名称与模式匹配,则会生成错误。

表达sed方式

/ALTER USER/ s/.*statement: //

将在给定文件中找到包含该字符串的任何行ALTER USER,然后删除从该行开头到该字符串之后的空格的所有内容statement:

相关内容