我正在 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
使用zsh
shellsed
查找并修改您要查找的行:
sed '/ALTER USER/ s/.*statement: //' postgresq*.log(.om[1])
通配模式postgresq*.log(.om[1])
在中进行了一些详细解释我的答案到你之前的问题。简而言之,它扩展为名称与模式匹配的最近修改的常规文件的名称postgresq*.log
,或者如果没有名称与模式匹配,则会生成错误。
表达sed
方式
/ALTER USER/ s/.*statement: //
将在给定文件中找到包含该字符串的任何行ALTER USER
,然后删除从该行开头到该字符串之后的空格的所有内容statement:
。