Shell脚本中echo无法输出"*.*"字符串及字段修改需求
解决Shell中echo输出
*.*显示文件列表及rsyslog.conf字段修改问题 一、echo输出*.*显示文件列表的原因与解决办法
你遇到的问题是Shell的通配符路径扩展导致的:当直接写ccvv=*.*时,Shell会自动把*.*解析成当前目录下所有包含.的文件名,再把这些文件名的列表赋值给变量ccvv。所以执行echo $ccvv时,输出的自然是展开后的文件列表,而非原始字符串*.*。
解决核心是阻止Shell对通配符进行扩展,常用方式有三种:
- 用双引号包裹变量赋值和输出:
ccvv="*.*" echo "$ccvv" # 输出:*.* - 用单引号(单引号会完全保留原始字符串,不做任何解析):
ccvv='*.*' echo "$ccvv" # 输出:*.* - 对通配符进行转义:
ccvv=\*\.\* echo "$ccvv" # 输出:*.*
二、修改/etc/rsyslog.conf中的字段(保留第一个,修改第二个)
要把类似asterisk.asterisk的字符串改成*.debug,可以用sed命令实现精准批量替换:
步骤1:先备份配置文件(重要!)
修改系统配置前一定要备份,避免出错后无法恢复:
cp /etc/rsyslog.conf /etc/rsyslog.conf.bak
步骤2:执行sed替换命令
sed -i 's/^\([^.]\+\)\..*/\1.debug/' /etc/rsyslog.conf
命令解释:
-i:直接修改文件内容(若想先预览效果,可去掉-i,查看输出是否符合预期)s/旧内容/新内容/:sed的基础替换语法^\([^.]\+\)\..*:匹配行开头的目标字符串:^:锁定行的起始位置\([^.]\+\):捕获第一个字段(匹配所有非.的字符,至少1个),用括号包裹以便后续引用\..*:匹配第一个.之后的所有内容
\1.debug:替换为捕获到的第一个字段(\1代表之前捕获的内容)加上.debug
示例验证
如果rsyslog.conf中有一行是:
asterisk.asterisk /var/log/asterisk.log
执行命令后会变成:
asterisk.debug /var/log/asterisk.log
内容的提问来源于stack exchange,提问作者chetan h
相关产品推荐
相关产品推荐

