如何使用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
解释:
s/[[:space:]]+ethernet[0-9]$//:移除每行末尾的ethernetX及前面的空格s/^(\*[A-Z]+[[:space:]]+|[[:space:]]+)//:移除开头的*大写字母+空格或者纯空格
内容的提问来源于stack exchange,提问作者praveen
相关产品推荐
相关产品推荐

