有没有办法在bash中的特定子字符串之后提取子字符串?
Posted
技术标签:
【中文标题】有没有办法在bash中的特定子字符串之后提取子字符串?【英文标题】:Is there a way to extract a substring after a specific substring in bash? 【发布时间】:2020-04-17 13:13:38 【问题描述】:我每天早上都会从我的一位工程师那里收到一个 .txt 文件,其中包含以下信息:
"New York"|NYC|network-details source-group NYC-srcIP dest-group NYC-destIP
"San Francisco"|SF|network-details source-group SF-srcIP dest-group SF-destIP
我们有一个运行的脚本,它可以通过提供指定的源组或目标组向我们返回类似于以下的信息:
#Calling on source-group
NYC-srcIP|000.000.000.0/32
SF-srcIP|111.111.111.1/32
#Calling on dest-group yields similar info
NYC-destIP|000.000.000.0/32
SF-destIP|111.111.111.1/32
我遇到的主要问题是对大量数据执行此操作并解析 .txt 文件中的字符串,以便我可以运行脚本并将其附加到 2 个不同的文件中,以获取源组和目标-所有这些位置的组。
但是 .txt 有多个分隔符。本质上,我只想要源组值(例如:NYC-srcIP)和目标组值(例如:NYC-destIP)。
在 bash 中是否有一种简单的方法可以做到这一点?最好是 pythonic,我可以在哪里为我的 .txt 文件中的每一行获取源组和目标组之后的第一个空格分隔子字符串?
【问题讨论】:
请为解析的 *.txt 文件添加所需的输出。NYC-srcIP
和 NYC-destIP
是文字字符串还是只是真实数据的占位符?
“类似下面的信息”中出现的类似IP的值是从哪里来的? (即|000.000.000.0/32
)。祝你好运。
【参考方案1】:
bash 版本:
pattern="source-group ([^[:space:]]+) dest-group ([^[:space:]]+)"
while read line; do
if [[ $line =~ $pattern ]]; then
echo $BASH_REMATCH[1] $BASH_REMATCH[2]
fi
done
bash test.sh
【讨论】:
【参考方案2】:基本的 cut / awk 应该足够了,像这样:
cat ex.txt | sed 's/".*"//' | awk 'print $3,$5'
或
cat ex.txt | sed 's/".*"//' | cut -d' ' -f3,5
sed
有助于摆脱双引号内的第一部分,其中可能包含空格,如 cmets 中所指出的那样。
【讨论】:
如果城市名称不包含空格(例如:“达拉斯”),那么这将不会产生正确的输出。目前尚不清楚“纽约”和“旧金山”是否是唯一的输入城市,我只是进行观察。您可以先通过awk
,使用'|'
作为分隔符,以隔离整个输入行的结尾部分,与城市名称中是否存在空格无关(例如:awk -F\| 'print $3'
)。
@kaan 你说得对,我错过了。我将编辑答案以使其更加一致。以上是关于有没有办法在bash中的特定子字符串之后提取子字符串?的主要内容,如果未能解决你的问题,请参考以下文章