有没有办法在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-srcIPNYC-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中的特定子字符串之后提取子字符串?的主要内容,如果未能解决你的问题,请参考以下文章

在 Hive SQL 中提取具有特定模式的子字符串

在特定单词之后从字符串中获取子字符串

有没有办法从 OpenOffice Calc 中的单元格中提取子字符串?

如何在Bash中提取多个唯一子字符串

在 Bash 中提取子字符串

在普通bash中使用正则表达式提取子字符串