나는 다음과 유사한 스크립트를 작성했습니다.
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
추가 정보:
위의 코드는 루프에서 실행되므로
$sandbox
매번 새로운 값이 생성됩니다.시도해 보았
grep -e "${sandbox}.*pset
으나 문제가 해결되지 않았습니다.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
다음 과 같이 할 수 있기 때문입니다.awk
awk
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
$sandbox
BEGIN
awk
awk
re
답변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 및 를 사용 하는[]
것이 가장 쉽기 때문입니다 .t
grep [abc]oo
aoo
boo
coo
당신이 grep 할 때고정 문자열 사용a를 사용하면
ps
grep 프로세스와 해당 매개변수에 대해서도 grep을 수행할 수 있습니다. 위의 트릭에서 REpse[t]
평가 결과는pset
고정 문자열과 일치하지 않습니다pse[t]
.
편집자: 골프 코드
srvc_location=$(ps -ef| grep -m 1 -o ${sandbox}."*pse[t]")
-m 1
일치하는 패턴만 인쇄-o
matchint 패턴만 출력
답변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
.