【问题标题】:Is there a way to extract a substring after a specific substring in bash?有没有办法在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)。祝你好运。

标签: regex string bash awk split


【解决方案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 你说得对,我错过了。我将编辑答案以使其更加一致。
    猜你喜欢
    • 2015-06-06
    • 2021-01-21
    • 1970-01-01
    • 2022-08-10
    • 2021-10-04
    • 2014-04-07
    • 2016-02-19
    • 2021-10-30
    • 1970-01-01
    相关资源
    最近更新 更多