如何使用sed命令和curl命令从web url中提取特定字符串

如何使用sed命令和curl命令从web url中提取特定字符串

使用Linux服务器

我有一个生成以下数据的 URL:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="/seriessnapshot.xsl"?>
<timeSeries>
<series parentPath="uat.fft.client.CB1201C.AP714628.fusion.ebond-fusion-nucleus-app.ebond-fusion-order-app" id="OpenFin Memory(MB)" latestItemTimestamp="1588874010094" datetime="2020/05/07 19:53:30" latestItemValue="101"/>
<series parentPath="uat.fft.client.CB1201C.AP714628.fusion.ebond-fusion-nucleus-app.ebond-fusion-rfq-credit" id="OpenFin Memory(MB)" latestItemTimestamp="1588874010094" datetime="2020/05/07 19:53:30" latestItemValue="101"/>
<series parentPath="uat.fft.client.CB1201C.AP714628.fusion.ebond-fusion-nucleus-app.ebond-fusion-risk-app" id="OpenFin Memory(MB)" latestItemTimestamp="1588874010094" datetime="2020/05/07 19:53:30" latestItemValue="96"/>
<series parentPath="uat.fft.client.CB3ERWE.AP717938.fusion.ebond-fusion-nucleus-app.ebond-fusion-order-app" id="OpenFin Memory(MB)" latestItemTimestamp="1588860133654" datetime="2020/05/07 16:02:13" latestItemValue="101"/>
<series parentPath="uat.fft.client.CB3ERWE.AP717938.fusion.ebond-fusion-nucleus-app.ebond-fusion-rfq-credit" id="OpenFin Memory(MB)" latestItemTimestamp="1588860133654" datetime="2020/05/07 16:02:13" latestItemValue="103"/>
<series parentPath="uat.fft.client.CB3ERWE.AP717938.fusion.ebond-fusion-nucleus-app.ebond-fusion-risk-app" id="OpenFin Memory(MB)" latestItemTimestamp="1588860133654" datetime="2020/05/07 16:02:13" latestItemValue="99"/>
<series parentPath="uat.fft.client.GA2ADAZ.AP718017.fusion.ebond-fusion-nucleus-app.ebond-fusion-rfq-credit" id="OpenFin Memory(MB)" latestItemTimestamp="1588874018986" datetime="2020/05/07 19:53:38" latestItemValue="107"/>
<series parentPath="uat.fft.client.GA2BASV.AP722002.fusion.ebond-fusion-nucleus-app.ebond-fusion-rfq-credit" id="OpenFin Memory(MB)" latestItemTimestamp="1588866113043" datetime="2020/05/07 17:41:53" latestItemValue="110"/>
<series parentPath="uat.fft.client.GA2BHUH.AP717267.fusion.ebond-fusion-nucleus-app.ebond-fusion-order-app" id="OpenFin Memory(MB)" latestItemTimestamp="1588864837395" datetime="2020/05/07 17:20:37" latestItemValue="102"/>
<series parentPath="uat.fft.client.GA2BHUH.AP717267.fusion.ebond-fusion-nucleus-app.ebond-fusion-rfq-credit" id="OpenFin Memory(MB)" latestItemTimestamp="1588864837395" datetime="2020/05/07 17:20:37" latestItemValue="126"/>
<series parentPath="uat.fft.client.GA2BHUH.AP717267.fusion.ebond-fusion-nucleus-app.ebond-fusion-risk-app" id="OpenFin Memory(MB)" latestItemTimestamp="1588864837395" datetime="2020/05/07 17:20:37" latestItemValue="114"/>
<series parentPath="uat.fft.client.GA2CRAD.AP718024.fusion.ebond-fusion-nucleus-app.ebond-fusion-rfq-sales" id="OpenFin Memory(MB)" latestItemTimestamp="1588862905103" datetime="2020/05/07 16:48:25" latestItemValue="102"/>
<series parentPath="uat.fft.client.GA2MRAH.AP711671.fusion.ebond-fusion-nucleus-app.ebond-fusion-quote-app" id="OpenFin Memory(MB)" latestItemTimestamp="1588867209058" datetime="2020/05/07 18:00:09" latestItemValue="103"/>
<series parentPath="uat.fft.client.GA2MRAH.AP711671.fusion.ebond-fusion-nucleus-app.ebond-fusion-rfq-credit" id="OpenFin Memory(MB)" latestItemTimestamp="1588867209058" datetime="2020/05/07 18:00:09" latestItemValue="116"/>
<series parentPath="uat.fft.client.GA2MRAH.AP711671.fusion.ebond-fusion-nucleus-app.ebond-fusion-risk-app" id="OpenFin Memory(MB)" latestItemTimestamp="1588867209058" datetime="2020/05/07 18:00:09" latestItemValue="113"/>
<series parentPath="uat.fft.client.GA2OUGB.AP721570.fusion.ebond-fusion-nucleus-app.ebond-fusion-order-app" id="OpenFin Memory(MB)" latestItemTimestamp="1588866117341" datetime="2020/05/07 17:41:57" latestItemValue="104"/>
<series parentPath="uat.fft.client.GA2OUGB.AP721570.fusion.ebond-fusion-nucleus-app.ebond-fusion-rfq-credit" id="OpenFin Memory(MB)" latestItemTimestamp="1588866117341" datetime="2020/05/07 17:41:57" latestItemValue="112"/>
<series parentPath="uat.fft.client.GA2OUGB.AP721570.fusion.ebond-fusion-nucleus-app.ebond-fusion-risk-app" id="OpenFin Memory(MB)" latestItemTimestamp="1588866117341" datetime="2020/05/07 17:41:57" latestItemValue="116"/>
<series parentPath="uat.fft.client.GA2PASH.AP722622.fusion.ebond-fusion-nucleus-app.ebond-fusion-rfq-credit" id="OpenFin Memory(MB)" latestItemTimestamp="1588850319464" datetime="2020/05/07 13:18:39" latestItemValue="103"/>
<series parentPath="uat.fft.client.GA2SA7H.AP721875.fusion.ebond-fusion-nucleus-app.ebond-fusion-quote-app" id="OpenFin Memory(MB)" latestItemTimestamp="1588866495109" datetime="2020/05/07 17:48:15" latestItemValue="110"/>
<series parentPath="uat.fft.client.GA2SA7H.AP721875.fusion.ebond-fusion-nucleus-app.ebond-fusion-rfq-credit" id="OpenFin Memory(MB)" latestItemTimestamp="1588866495109" datetime="2020/05/07 17:48:15" latestItemValue="102"/>
<series parentPath="uat.fft.client.GA2SA7H.AP721875.fusion.ebond-fusion-nucleus-app.ebond-fusion-risk-app" id="OpenFin Memory(MB)" latestItemTimestamp="1588866495109" datetime="2020/05/07 17:48:15" latestItemValue="123"/>
<series parentPath="uat.fft.client.ga2cria.AP716960.fusion.ebond-fusion-nucleus-app.ebond-fusion-quote-app" id="OpenFin Memory(MB)" latestItemTimestamp="1588874030265" datetime="2020/05/07 19:53:50" latestItemValue="130"/>
<series parentPath="uat.fft.client.ga2cria.AP716960.fusion.ebond-fusion-nucleus-app.ebond-fusion-rfq-credit" id="OpenFin Memory(MB)" latestItemTimestamp="1588874030265" datetime="2020/05/07 19:53:50" latestItemValue="125"/>
<series parentPath="uat.fft.client.ga2cria.AP716960.fusion.ebond-fusion-nucleus-app.ebond-fusion-risk-app" id="OpenFin Memory(MB)" latestItemTimestamp="1588874030265" datetime="2020/05/07 19:53:50" latestItemValue="107"/>
<series parentPath="uat.fft.client.ga2fasa.AP715911.fusion.ebond-fusion-nucleus-app.ebond-fusion-order-app" id="OpenFin Memory(MB)" latestItemTimestamp="1588873964945" datetime="2020/05/07 19:52:44" latestItemValue="101"/>
<series parentPath="uat.fft.client.ga2fasa.AP715911.fusion.ebond-fusion-nucleus-app.ebond-fusion-risk-app" id="OpenFin Memory(MB)" latestItemTimestamp="1588873964945" datetime="2020/05/07 19:52:44" latestItemValue="113"/>

正如您所看到的,每个 AP 编号都不同,开头的两个字母也可能不同,因此在不同的 URL 上 AP 也可能是 BR AD CS。我需要编写一个命令来提取并创建一个仅包含所有 AP 编号的列表,但 AP 部分应该能够提取任何字母,只是数字部分需要接受任何数字,而且我还需要删除重复项从列表中提取 AP。

到目前为止,我已经创建了以下 shell 脚本:

echo 'ID,User,HostName,Application,DateTime,Value'
curl -k -s 'https://testurl'

我现在需要在命令末尾添加一个管道并使用 awk、sed 或 grep。我需要提取所有 AP 号码,删除重复的 AP 号码并创建所有 AP 号码的列表,但请记住字母 AP 也是动态的,它们可以更改为字母表中的任意两个字母。

我尝试了以下 awk 命令:

/usr/bin/curl -k -s https://example.com:18080/seriessnapshot?substringSearch=OpenFin%20Memory | awk -F".AP" '{print $2}' | awk -F. '{print $1}' | sort | uniq

然而,这只返回以下内容:

717958
717961
717962
717977
717980
717982
717996
718397
718685
718954
719045
719051
719257
719262
719265
719432
719488
719821
719905
719906
720203
720455
720467
720911
721548
721569
721732
721737

它不会返回数字开头的两个字母(可以是任意两个字母),知道我如何告诉 awk 命令接受数字之前的任意两个字母,然后接受任何数字并打印出整列吗?

答案1

@Nikhil,您原来的问题没有提到任何 XML 格式,它只有原始内容。由于您知道数据包含在 XML 中,因此更可靠的方法是遵循建议 xmlstarlet 或特定于此作业的工具的其他答案之一的建议。

如果你确定格式不会改变,并且想要对此进行快速而肮脏的处理,并且您确定要使用 awk,这对您有用吗:

awk -F"." '{print $5}' | sort --unique

以下是此代码的链接以及您问题中的一些示例数据: 在线尝试一下!

答案2

curl "URL" | grep -E -o 'AP[[:digit:]]+' | sort -u

这将获取数据,提取所有 AP 编号,并对它们进行排序,同时删除重复项。

这假设 AP 编号仅出现在您显示的数据中,而不出现在任何其他不相关的位置(您显示的 XML 文档在末尾被截断)。


为了更安全地解析 XML,请使用xmlstarlet

curl "URL" |
xmlstarlet sel -t -v '/timeSeries/series/@parentPath[contains(.,"AP")]' |
grep -E -o 'AP[[:digit:]]+' | sort -u

这会解析出属性的所有长值parentPath,并将它们传递给grepsort


用它来做这一切xmlstarlet也是可能的。在这里,我假设您需要与包含字符串的属性值相对应的所有 AP 编号credit

curl "URL" |
xmlstarlet sel -t \
    -m '/timeSeries/series/@parentPath[contains(., "credit")]' \
    -v 'concat("AP", substring-before(substring-after(., "AP"), "."))' -nl

如果仅查找字符串credit会丢失一些 AP 编号,则只需将它们全部提取出来并像sort -u以前一样使结果列表唯一:

curl "URL" |
xmlstarlet sel -t \
    -m '/timeSeries/series/@parentPath' \
    -v 'concat("AP", substring-before(substring-after(., "AP"), "."))' -nl |
sort -u

答案3

这是假设文件格式符合您的列表......

cat sample.txt | awk -F".AP" '{print $2}' | awk -F. '{print $1}' | sort | uniq

相关内容