2014-05-13 2 views
1

나는 다음과 같은 실행하려고 해요 :추출 그렙 일치 나오지

echo $line | grep "u01/app/[0-9]" | sed -n 's/[0-9]|\./p' 

경우

line="orb 14171 orb 3u REG 253,3 0 14141 /u01/app/11.2.0.4/broa/log/stm1025/agent/" 

그리고 내가 뭘하고 싶은 버전 번호를 추출하고,에 저장입니다 변수,하지만 위의 명령을 실행할 때마다, 나는 그것을 sed : 명령 왜곡 된 것 : s/[0-9]p

아무 잘못 알아?

+0

당신이 출력으로 좋아하는 가치는 무엇입니까? – Jotne

답변

1

당신은 그것을 변수 line에서 네 번째 필드 소요 awk

ver=$(awk -F/ '/u01\/app\/[0-9]/ {print $4}' <<< "$line") 
echo "$ver" 
11.2.0.4 

을 시도하고 변수에의 한 줄, 당신이 시험을 생략 할 수있는 경우 변수 ver

에 저장할 수 있습니다 사용 :

ver=$(awk -F/ '{print $4}' <<< "$line") 

간단하고 값을 직접 제공하십시오. 복잡한 정규식 :

+0

죄송합니다. $ $ line이 잘못되었습니다. – AkshaiShah

+0

편집을 참조하십시오.'/ F '는 필드 구분자로'/'를 표시하므로 아무런 변화가 없습니다. – cadrian

+0

놀라워요! 그러면 "/ u01 \/app \/[0-9] /"부분부터 시작됩니까? – AkshaiShah

2

당신이 떠들썩한 파티와 GNU의 GREP이 가정은 :

version=$(grep -oP '(?<=/u01/app/).+?(?=/)' <<< "$line") 
echo "$version" # => 11.2.0.4 

PCRE의 정규식 /u01/app/ 내가 당신 나오지도 명령을 실행할 때, 내이다 나오지 다음 /

2

사이의 모든 문자를 찾습니다 없다

sed -n 's/[0-9]|\./p' 
sed: 1: "s/[0-9]|\./p": unterminated substitute in regular expression 

전체 대체 명령을 작성하지 않았기 때문에 대체 명령에 f ollowing 구문 : s/…/…/ 당신은 단지 s/…/.

당신은 나오지도 고수하기 위해 시도 할 수 있습니다 :

echo $line | sed -e 's,.*/u01/app/\([0-9\.]*\)*/.*,\1,' 
11.2.0.4 
+0

'[0-9.]'이면 충분합니다. 클래스에서 이스케이프 점이 필요하지 않습니다. '+'대신에 버전을 추출하는 것이 더 좋을 수도 있습니다. 대안은'[^ /] \ {1, \}'입니다. – NeronLeVelu