文字列を抽出したいログファイルがあります。数値文字列はランダムに生成され、これまでgrep/sed/awkを使用したすべての試行は失敗しました。
次の項目があります。
"id":"30c962de-b448-40ac-ade8-da6a8f49ce88","title":
私が分析したいのは、ランダムに生成された部分です。
30c962de-b448-40ac-ade8-da6a8f49ce88
このタスクを実行するための迅速で汚い方法がある人はいますか?
答え1
速すぎて汚いですか?
$ grep -o -P '(?<=")[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}(?=")' input
30c962de-b448-40ac-ade8-da6a8f49ce88
"30c962de-b448-40ac-ade8-da6a8f49ce88"
固定長とダッシュ位置(引用符で囲む)を持つ任意の値を見つけて-
印刷します。そのセクションにもこだわりたい場合は、デフォルトの"id":
提案条件に追加してください(?<=")
。
jq
ただし、これがJSONまたは一般データの場合は、適切なパーサーを使用してそのデータ(他のデータなど)を処理することを検討する必要があります。
答え2
提供された入力にAWKを使用するもう一つの汚いトリックです。
data='"id":"30c962de-b448-40ac-ade8-da6a8f49ce88","title":
echo $data | awk -F , '{ print $1}' | awk -F id: '{print $1}' | awk '{print $1}'
"30c962de-b448-40ac-ade8-da6a8f49ce88"
答え3
これが実際にJSON文書である場合は、次のようにjq
データ型に関係なく文字列を取得します。
jq -r '.document[2].part.id' file.json
id
これは、キーがJSONデータ構造の最上位配列にある特定の要素の一部であるオブジェクトpart
の一部であると仮定します。document
または直接抽出することもできます。みんな id
値:
jq -r '.. | select(type=="object" and has("id")) | .id' file.json
答え4
使用awk
:
awk -F"[\":]" '{ print $5 }' infile