以下を使用して、リアルタイムで接続されたドライブの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);
?>