grep /var/log /etc/rsyslog.conf | awk '{print $2}'
输出:
/var/log/messages
/var/log/secure
-/var/log/maillog
/var/log/cron
-/var/log/spooler
/var/log/boot.log
我希望结果是:
/var/log/messages
/var/log/secure
/var/log/maillog
/var/log/cron
/var/log/spooler
/var/log/boot.log
我需要删除-
.
答案1
grep /var/log /etc/rsyslog.conf | awk '{print $2}' | sed 's/^-//'
sed
s/^
将查找后跟连字符的行的开头-
并将其替换为空字符串//
。
答案2
简单的解决方案
您将问题标记为 linux,所以我假设您正在使用 GNU grep。那么最简单的方法就是修改您的grep
调用以仅输出您想要的文本:
grep -o '/var/log/.*' /etc/rsyslog.conf
该-o
选项导致grep
仅打印匹配部分,而不是整行。为此,我将 添加到/.*
了模式中。这是有效的,因为路径是行中的最后一个组件。
修改
如果有什么事情沿着你所做的道路进行不是想要打印,正则表达式和grep
调用看起来有点不同:
egrep -o '/var/log/\S*' /etc/rsyslog.conf
\S
这将包括后的任何非空白 ( ) 字符序列/var/log/
。由于\S
属于扩展正则表达式,因此调用改为egrep
改为grep
。 (你也可以用grep -E
它。)
如果你也想种类结果列表,并且可能消除重复项,结果可以通过管道输入sort
:
egrep -o '/var/log/\S*' /etc/rsyslog.conf | sort -u
代表-u
“唯一”,因此重复的内容将被删除。
答案3
一种简单的方法是扩展命令以删除-
连字符:
grep /var/log /etc/rsyslog.conf | awk '{print $2}' | sed 's/^-//g'
grep /var/log /etc/rsyslog.conf | awk '{print $2}' | tr -d '-'
或者使用awk
:
grep /var/log /etc/rsyslog.conf | awk '{sub("-","",$2);print $2}'
答案4
您可以使用以下函数-
从字段 2 中删除前导破折号:sub()
awk
grep /var/log /etc/rsyslog.conf | awk '{ sub(/^-/, "", $2); print $2 }'
如果您需要删除全部从字段 2 的开头开始的破折号:
grep /var/log /etc/rsyslog.conf | awk '{ sub(/^-*/, "", $2); print $2 }'
或者grep
使用以下命令消除并搜索模式awk
:
awk '/\/var\/log/ { sub(/^-*/, "", $2); print $2 }' /etc/rsyslog.conf