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番号は異なり、最初の2文字も異なる可能性があるため、他のURLではAPがBR AD CSである可能性があります。すべてのAP番号のみを含むリストを抽出して生成するコマンドを作成する必要がありますが、AP部分はすべての文字を抽出できる必要があり、数字部分のみがすべての数字を受け入れる必要があり、抽出するには重複項目も削除する必要があります。リストからAP。

これまでに、次のシェルスクリプトを作成しました。

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

コマンドの最後にパイプを追加し、awk、sed、または grep を使用する必要があります。すべてのAP番号を抽出し、重複したAP番号を削除し、すべてのAP番号のリストを作成する必要があります。しかし、APという文字も動的で、アルファベットの2文字に変更できることを覚えておいてください。

次の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

数字の最初の2文字(2文字かもしれません)は返されません。 awkコマンドで数字の前の2文字を許可してから、任意の数字を受け入れ、列全体を印刷するように指示する方法を知っていますか?

答え1

@Nikhil、あなたの元の質問にはXML形式は記載されておらず、生のコンテンツのみがありました。データがXMLに含まれていることがわかっているので、より信頼性の高いアプローチは、xmlstarletを提案する他の答えの1つ、またはこれに関連するツールのアドバイスに従うことです。

もしあなたなら確信するフォーマットは変更されず、これに対して迅速で汚いことをしたいのですが、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

これは、属性のすべての長い値を解析してandparentPathに渡します。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

関連情報