awk - "somestring:" 前の値を抽出します。

awk - "somestring:" 前の値を抽出します。

以下を使用して、リアルタイムで接続されたドライブのUUIDを取得するスクリプトを作成しています。

udiskctl monitor

以下はいくつかの標準出力ラインです。

HintPartitionable:          true
HintSymbolicIconName:       
HintSystem:                 false
Id:                         by-uuid-EXTERNALLABEL
IdLabel:                    
IdType:                     vfat
IdUUID:                     EXTERNALLABEL
IdUsage:                    filesystem
IdVersion:                  FAT32

だから古い文字列を取得したいと思います。idUUID:

予想出力:

EXTERNALLABEL

誰でもどんなアイデアがありますか?提案してください。

答え1

これは一般的な質問であり、これを行う方法にはすでに答えがありますが、awk次の方法を使用できます。

udiskctl monitor | awk '{if (match($0,"^[[:space:]]*IdUUID:[[:space:]]*([[:print:]]+)",a)) print a[1]}'

または@Archemarの提案によると、短いです。

udiskctl monitor | awk '/^[[:space:]]*IdUUID:/ {print $2}'

またはより強力になるには、@ Ed Mortonの提案に従ってください。

udiskctl monitor | awk '$1=="IdUUID:"{print $2}'

またはもちろん、あまりにも古いですsed

udiskctl monitor | sed -e 's/^[[:space:]]*IdUUID:[[:space:]]*//;t;d'

答え2

正解は次のとおりです。

$ awk '$1=="IdUUID:"{print $2}' file
EXTERNALLABEL

現在受け入れられている答えは、検索中の文字列を正規表現として不要で誤って処理するため、文字列に正規表現メタ文字が含まれているとメソッドは失敗します。

答え3

著作権ジェームズ・ダニエル・マス・リッチ(James Daniel Mars Rich)。この資料はawk - "somestring:" 前の値を抽出します。'cc by-sa 4.0の規約によると(https://creativecommons.org/licenses/by-sa/4.0/legalcode)、'から得ることもできます。https://snippetly.blogspot.com/2019/12/extracting-value.html' 次のライセンスの条件に従います: Comprehensive Open License 3.0(https://jamesdanielmarrsritchey.blogspot.com/2019/06/compressive-open-license-30.html)、MIT(https://opensource.org/licenses/MIT)。

Awkの代わりに、PHPを使用すると、改行文字を区切り文字として出力を配列に分割して文字列の値部分を抽出できます。次に、コロンを区切り文字として使用して、各配列値を異なる配列に分割します。次に、各値の先頭と末尾のスペースを切り捨てます。最後に、目的の項目であるか、値がエコーされているかを確認してください。

<?php

$output = <<<'EOT'

Item1:          Value1

Item2:                     Value2

Item3:                     Value3

Item4:                  Value4

EOT;

$data = explode("\n", $output);

foreach ($data as $item){

    $result = FALSE;

    $value = explode(':', $item);

    if (trim($value[0]) === 'Item3'){

        echo trim($value[1]) . "\n";

        exit(0);

    }

}

echo "Value not found.\n";

exit(1);

?>

関連情報