求助:通过Shell脚本提取特定格式的日志路径生成字符串
Shell脚本提取指定路径并拼接的实现方法
你需要从给定字符串中提取符合以/开头、包含至少两个斜杠、以;结尾的路径,去掉末尾的;后用空格拼接,以下是几种实用的实现方式:
方法1:grep + sed 组合(简洁高效)
这是最常用的组合,利用grep提取匹配片段,sed处理收尾,最后用tr合并为空格分隔的字符串:
String1="/var/log/messages; is a critical file which stores logs. /var/log/secure; stores user's login attempts. /var/log/tallylog; stores login tally information." # 提取匹配片段并处理 String2=$(echo "$String1" | grep -o '/[^;]*;' | sed 's/;$//' | tr '\n' ' ') # 移除末尾多余的空格 String2=$(echo "$String2" | sed 's/ $//') # 输出结果 echo "$String2"
步骤解释:
grep -o '/[^;]*;':-o参数只输出匹配的部分,正则/[^;]*;精准匹配以/开头、到;结束的子串,自动过滤无关内容。sed 's/;$//':删除每个匹配结果末尾的;。tr '\n' ' ':把grep输出的每行结果替换为空格,拼接成一行。- 最后一步sed去掉字符串末尾可能残留的空格,让结果更规整。
方法2:awk 一步到位(全能处理)
awk可以直接完成遍历、匹配、修改、拼接的全流程,无需多个工具配合:
String1="/var/log/messages; is a critical file which stores logs. /var/log/secure; stores user's login attempts. /var/log/tallylog; stores login tally information." String2=$(echo "$String1" | awk '{ res = "" for (i=1; i<=NF; i++) { # 正则匹配:以/开头、至少包含两个斜杠、以;结尾 if ($i ~ /^\/.*\/.*\/.*;$/) { sub(/;$/, "", $i) # 移除末尾的; res = res $i " " } } sub(/ $/, "", res) # 移除末尾空格 print res }') echo "$String2"
步骤解释:
- awk默认按空格分割字符串为多个字段,遍历每个字段逐一检查。
- 正则
^\/.*\/.*\/.*;$确保路径符合要求:^\/是开头的/,.*\/.*\/保证至少有两个斜杠(三级及以上路径),.*;$是结尾的;。 - 用
sub函数删除末尾的;,逐步拼接结果,最后处理收尾空格。
方法3:纯Bash内置操作(无外部依赖)
如果不想调用外部工具,仅用Bash自身的字符串处理功能也能实现:
String1="/var/log/messages; is a critical file which stores logs. /var/log/secure; stores user's login attempts. /var/log/tallylog; stores login tally information." String2="" # 将字符串按空格分割为数组 read -ra path_arr <<< "$String1" # 遍历数组每个元素 for item in "${path_arr[@]}"; do # 正则匹配验证格式 if [[ "$item" =~ ^\/.*\/.*\/.*;$ ]]; then # 用参数扩展移除末尾的; clean_path="${item%;}" # 拼接到结果字符串 String2+="$clean_path " fi done # 移除末尾多余的空格 String2="${String2% }" echo "$String2"
步骤解释:
read -ra path_arr <<< "$String1":把原字符串按空格分割成数组,方便逐个处理。[[ "$item" =~ ^\/.*\/.*\/.*;$ ]]:用Bash内置的正则匹配判断元素是否符合路径规则。${item%;}:Bash参数扩展语法,直接删除字符串末尾的;,比sed更轻量。${String2% }:同样用参数扩展移除结果末尾的空格,完成最终拼接。
以上三种方法都能得到你需要的/var/log/messages /var/log/secure /var/log/tallylog结果,可根据实际场景选择使用。
内容的提问来源于stack exchange,提问作者Abhishek D
相关产品推荐
相关产品推荐

