파이프를 사용하여 AND 패턴을 잡는 방법

파이프를 사용하여 AND 패턴을 잡는 방법

나는 다음과 유사한 스크립트를 작성했습니다.

srvc_location=`ps -ef| grep '${sandbox}.*pset' | head 1 | awk {print $9}`
echo "SERVICE LOC : "$srvc_location

그런데 이상한 점은 $srvc_location대부분의 경우 문제가 해결되지만 때로는 다음 메시지와 함께 해결되지 않는다는 것입니다.

SERVICE LOC : strrosdev_silo1_int.*pset

추가 정보:

  1. 위의 코드는 루프에서 실행되므로 $sandbox매번 새로운 값이 생성됩니다.

  2. 시도해 보았 grep -e "${sandbox}.*pset 으나 문제가 해결되지 않았습니다.

  3. grep두 개를 사용하면 문제를 해결할 수 있지만 grep $sandbox |grep pset패턴에는 하나만 사용하고 싶습니다.

왜 이런가요?

답변1

코드가 실패하는 이유 중 하나는 변수 주위의 표현식에 큰따옴표 '...'대신 작은따옴표를 사용하기 때문입니다."..."grep

대신 이것을 사용하십시오

srvc_location=$(ps -ef| grep "${sandbox}.*pset" | head -1 | awk '{print $9}')
echo "SERVICE LOC : $srvc_location"

실제로 다음과 같이 결합할 필요가 거의 없습니다. 왜냐하면 head다음 과 같이 할 수 있기 때문입니다.awkawk

srvc_location=$(ps -ef| grep "$sandbox.*pset" | awk '{print $9; exit}')

이것도 덜 명확하지만 grep여기에 포함되어 있습니다.

srvc_location=$(ps -ef| awk -v sb="$sandbox" 'BEGIN { re = sb ".*pset" } $0 ~ re { print $9; exit}')

여기에 우리가 사용하는 몇 가지 기능이 있습니다 awk. 쉘 변수의 값을 취하는 awk변수를 정의합니다 . 이 블록은 일치해야 하는 패턴이 포함된 변수를 정의하고, 스크립트의 나머지 부분은 변수의 정규식과 일치하며 필수 필드를 인쇄하고 완료되자마자 종료됩니다.sb$sandboxBEGINawkawkre

답변2

grep은 grep 그 자체여야 합니다.

당신은 시도 할 수 있습니다

srvc_location=$(ps -ef| grep ${sandbox}."*pse[t]" | awk '{print $9;exit;}')
  • grep "*pse[t]"grep은 가능 pset하지만 불가능pse[t]

    pse[t]정규식(RE라고 함)은 문자열 pse과 그 안에 있는 문자 하나를 나타내기 때문에 t이 구문은 문자 하나에 거의 사용되지 않습니다 . 일반적으로 who match 및 를 사용 하는 []것이 가장 쉽기 때문입니다 .tgrep [abc]ooaooboocoo

    당신이 grep 할 때고정 문자열 사용a를 사용하면 psgrep 프로세스와 해당 매개변수에 대해서도 grep을 수행할 수 있습니다. 위의 트릭에서 RE pse[t]평가 결과는 pset고정 문자열과 일치하지 않습니다 pse[t].


편집자: 골프 코드

srvc_location=$(ps -ef| grep -m 1 -o ${sandbox}."*pse[t]")
  • -m 1일치하는 패턴만 인쇄
  • -omatchint 패턴만 출력

답변3

명령은 다음과 같이 작성하는 것이 가장 좋습니다.

srvc_location=$(ps -ef| grep '${sandbox}.*pset' | head 1 | awk {print $9})

귀하의 버전은 srvc_location을 ps 값으로 설정한 다음 실행을 시도 -ef하고 출력을 grep기타 로 파이프하려고 시도합니다.

답변4

지금까지 한 가지만 추가하면 됩니다.

주문하다

head 1

첫 번째를 출력합니다10파일의 줄 수명명 된 1, 그리고완전히 무시됩니다stdin.

(명령의 해당 부분에 대해) 원하는 것은 다음과 같습니다.

head -1

표준 입력의 첫 번째 줄(한 줄만)을 출력합니다.

아니면 awk이미 제안된 기능을 사용하세요. 하지만 무엇이든 사용할 때는 이것을 알아야 합니다 head.

관련 정보