쉘 스크립트의 테이블에서 사용자 로그인 이름과 일치하는 ID를 추출합니다.

쉘 스크립트의 테이블에서 사용자 로그인 이름과 일치하는 ID를 추출합니다.

여기에 이미지 설명을 입력하세요.그래서 저는 이러한 모든 사용자 로그인(service, admin, J009878)을 가지고 있고 여기에 보이는 이 테이블은 다른 명령에서 나온 것이고 그 출력은 제가 file.txt에 저장한 이 테이블입니다. 내가 달성하고 싶은 것은 file.txt 파일(테이블이 있는 위치)을 찾아 로그인 정보와 일치하는 ID를 추출할 수 있는 것입니다. 로그인 정보(J009878, admin 또는 그 중 하나일 수 있음)는 $user 변수의 형태로 제공되며, 해당 변수와 일치하는 ID를 추출하는 데 사용해야 합니다.

예를 들어, 내 변수 사용자가 로그인 또는 ID J665454를 얻는 경우 거기에서 ID 23을 추출할 수 있기를 원합니다. 마찬가지로 로그인 이름이 admin인 경우 ID 4를 추출하여 변수에 저장해야 합니다.

어떤 도움이라도 대단히 감사하겠습니다. 감사합니다!

답변1

$person로그인 이름이 저장되어 있다고 가정하면 다음 GNU sed 명령을 사용하여 이를 달성할 수 있습니다 .

sed -En "s_\s*\|([0-9]+)\s*\|\s*$person\s*\|.+_\1_p"

예:

❯ set person Jack

❯ cat table.txt | sed -En "s_\s*\|([0-9]+)\s*\|\s*$person\s*\|.+_\1_p"
4

❯ set person David

❯ sed -En "s_\s*\|([0-9]+)\s*\|\s*$person\s*\|.+_\1_p" table.txt # also works
32

설명하다:

sed -E -n: -E는 확장 정규식 플래그를 설정하고, -n은 명시적으로 지시하지 않는 한 sed가 인쇄하지 않도록 합니다.

s_<regex>_<replacement>_p: s는 대체 명령입니다( _어떤 문자라도 가능합니다. _가독성을 위해 선택했습니다). 정규식과 일치하여 대체 표현식으로 바꿉니다. 마지막 것은 p그것을 인쇄하게 하고, 우리가 사용했기 때문에 -n일치하는 줄만 인쇄하게 될 것입니다.

\s*\|([0-9]+)\s*\|\s*$person\s*\|.+: 표현식의 정규 표현식 부분으로, 다음과 같이 설명됩니다.

정규식 중요성
\s*\| 이는 임의 개수의 공백(테이블이 공백으로 시작하는 경우)과 일치한 다음 리터럴과 일치합니다 |. 정규식에서는 특별한 의미를 갖기 |때문에 탈출합니다 .|
([0-9]+) 이는 0-9 범위의 하나 이상의 문자와 일치합니다. 대부분의 정규식 엔진에서는 \d이 기능을 사용할 수도 있지만 sed지원되지 않습니다 \d. 표현식 주위의 괄호는 이를 대체에서 참조하는 데 사용할 수 있는 "그룹"에 넣습니다 \1-9. 예를 들어, echo "hello" | sed "s_([aeiou])/\1\1_g"will generate 는 heelloo각 모음이 2개의 복사본으로 대체되기 때문입니다(g 플래그를 사용하면 한 줄에 여러 번 작동하게 됩니다).
\s*\|\s* 임의의 공간(공백 없음 포함), 텍스트 |, 임의의 공간(공백 없음 포함) 순입니다.
$person 이 부분은 쉘로 대체될 것이며 sed는 이를 결코 볼 수 없으므로 Jack스크립트가 호출될 때 일치하는 문자 또는 기타 항목으로 끝날 것입니다.$person
\s*\| 원하는 수의 공백(공백 없음 포함)과 text 를 일치시켜 찾고 있는 로그인이 일치하지 않는지 |확인해야 합니다 .JackieJack
.+ 이는 줄 끝까지의 모든 항목과 일치합니다. 교체를 수행할 때 일치하지 않는 모든 항목이 여전히 인쇄되므로 전체 라인이 일치하는지 확인해야 하기 때문에 이는 중요합니다.

\1: 정규식이 일치하는 항목(전체 줄이기를 바랍니다)을 우리가 찾고 있는 ID 번호인 그룹 1로 바꿉니다. 그러면 전체 행이 해당 ID 번호만 유지하게 되므로 해당 행을 인쇄합니다.

관련 정보