파일에서 GUID만 찾기 - Bash

파일에서 GUID만 찾기 - Bash

GUID를 포함할 수 있는 파일이 있습니다(그들의표준 텍스트 표현).

파일의 각 GUID에 대해 작업을 수행하고 싶습니다. GUID는 원하는 수만큼 포함될 수 있습니다.

읽을 수 있는 파일이 준비되어 있습니다. GUID를 찾는 방법은 무엇입니까?

나는 그것을 사용해야 한다는 것을 안다.while read FILENAME

내 파일의 예:

GUIDs
--------------------------------------
cf6e328c-c918-4d2f-80d3-71ecaf09bf7b
91d523b0-4926-456e-a9d2-ade713f5b07f
(2 rows)
// THERE IS AN EMPTY LINE HERE AFTER NUMBER OF ROWS

답변1

GNU로 구현 grep(또는 호환) :

<your-file grep -Ewo '[[:xdigit:]]{8}(-[[:xdigit:]]{4}){3}-[[:xdigit:]]{12}' |
  while IFS= read -r guid; do
    your-action "$guid"
    sleep 5
  done

이러한 GUID는 입력의 어느 곳에서나 찾을 수 있습니다(앞이나 뒤에 오지 않는 경우).단어 문자).

GNU에는 정규식의 비어 있지 않은 일치 항목을 인쇄하는 옵션이 grep있습니다 .-o

-w전체 단어에만 일치하는 SysV의 또 다른 비표준 확장입니다. 일치하는 텍스트가 비단어 문자와 단어 문자 사이의 전환과 단어 문자가 영숫자 또는 밑줄인 단어와 비단어 문자 사이의 전환 사이에 있는 경우에만 일치합니다. 이는 다음과 일치하는 것을 방지하기 위한 것입니다.

아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아

나머지는 표준 POSIX 구문입니다. ABCDEF도 일치 합니다 [[:xdigit:]]. [0123456789abcdef]소문자 GUID만 일치시키려면 .

답변2

나는 정규 표현식을 좋아하지만과도한 사양을 피하세요. 이 특정 데이터세트(알려진 데이터 형식, 행당 하나의 GUID, 머리글 및 바닥글)의 경우 간단히 머리글/바닥글을 제거했습니다.

$ cat guids.txt | egrep -v 'GUIDs|--|rows|^$' |
    while read guid ; do
      some_command "$guid"
      sleep 5
    done

또는 원하는 행을 찾아내면서 현재 데이터세트에 대해 정규식을 최대한 간단하게 만들 수도 있습니다.

egrep '^[0-9a-f-]{36}$'

관련 정보