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);

?>

관련 정보