如何从输出列表中删除特定句子的第一个字符

如何从输出列表中删除特定句子的第一个字符
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/^-//'

seds/^将查找后跟连字符的行的开头-并将其替换为空字符串//

答案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

相关内容