다음을 사용하여 실시간으로 연결된 드라이브의 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);
?>