You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Bash脚本解析文本文件?新手求助解决内容提取问题

Bash脚本解析文本文件问题

我是Bash脚本新手,需要解析sample.txt文本文件,文件内容如下:

*AR   eth0      ethernet0
*A    eth1      ethernet1
      eth2      ethernet2
                ethernet3
*A     eth4      ethernet4
      T  E S T  ethernet5

我希望得到如下输出:

eth0
eth1
eth2

eth4
T  E S T

我用了下面的命令,但没生效:

sed 's/^ \{1,\}/SPACE_PLACEHOLDER/g' sample.txt | awk '{print $2}' | sed 's/SPACE_PLACEHOLDER/ /g'

问题原因

你之前的命令逻辑有问题:把开头空格替换成占位符后,awk仍然会按空格分割字段,导致第四行没有$2(输出空),最后一行的T E S T会被拆成多个字段,只取$2只能得到T,完全不符合需求。

解决方案

方法1:用awk处理

直接处理每行内容,精准提取需要的部分:

{
    # 移除每行末尾的 "ethernetX" 部分
    sub(/[[:space:]]+[^[:space:]]+$/, "")
    # 移除开头的 "*开头标识+空格" 或者纯空格
    sub(/^(\*[^[:space:]]+[[:space:]]+|[[:space:]]+)/, "")
    # 输出处理后的内容,空行自动保留
    print $0
}

执行命令:

awk -f script.awk sample.txt

或者直接用一行命令:

awk '{sub(/[[:space:]]+[^[:space:]]+$/, ""); sub(/^(\*[^[:space:]]+[[:space:]]+|[[:space:]]+)/, ""); print $0}' sample.txt

方法2:用sed处理

通过正则替换完成提取:

sed -E 's/[[:space:]]+ethernet[0-9]$//; s/^(\*[A-Z]+[[:space:]]+|[[:space:]]+)//' sample.txt

解释:

  1. s/[[:space:]]+ethernet[0-9]$//:移除每行末尾的ethernetX及前面的空格
  2. s/^(\*[A-Z]+[[:space:]]+|[[:space:]]+)//:移除开头的*大写字母+空格或者纯空格

内容的提问来源于stack exchange,提问作者praveen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 09:35:07