2014-08-27 3 views
0

가 나는 배쉬 콘솔grep을 사용하여 콘솔에서 텍스트를 추출합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

{ "id" : "0cba-2dbc-11e4-8c2c-bb68" } 

의 파일 test.sh을 실행 한 후 다음과 같은 출력이 나는 단지 GREP 또는 egrep을 명령을 사용하여 id의 값을 취득합니다. 이것은 내가 지금까지 시도한 것입니다 :

test.sh | grep -E "(: \".*\" })" 

위 출력과 똑같은 결과가 출력됩니다.

test.sh | grep -E "(: \"(.*)\" })" 

하지만 난 여전히 같은 결과로 끝나는 오전 : 내가 값 주위에 괄호 (.*)을 추가하여 그룹화 시도 그래서 다음으로 저장합니다.

값을 얻는 방법이 있습니까 : 0cba-2dbc-11e4-8c2c-bb68 python을 사용하지 않고 인쇄 하시겠습니까?

grep -Po '"id"\s*:\s*"\K[^"]*' 

\K 여기 뒤에 모양 같은 입니다 :

+0

은''sed'들이 JSON 형식을 "이해"하지 않는 한 항상 나쁜 생각 –

답변

1

또 다른 awk

echo '{ "id" : "0cba-2dbc-11e4-8c2c-bb68" }' | awk -F\" '$2=="id" {print $4}' 
0cba-2dbc-11e4-8c2c-bb68 
+0

+1 문자열을 출력합니다. 하지만 다른 사람이 먼저 대답했습니다. 이 awk와 @anubhava의 차이점이 있습니까? 아니면 다른 것보다 유연성이 있습니까? awk에 익숙하지 않은 Im –

+0

@Jai 두 awk 모두 작동합니다. 내 것이 더 짧아. 필자는 필드 구분자를'''(데이터를 큰 따옴표로 나눔)로 설정 한 다음 네 번째 필드를 출력합니다.'$ 4 '를'$ 1' 또는'$ 2' 또는'$ 3' 등으로 변경하여 분할에서 출력으로 얻으십시오 – Jotne

+0

설명 주셔서 감사합니다 올바른 것으로 표시] –

3

당신이 -o 옵션이 필요,이 줄을 시도합니다. 고정 된 수의 문자를 지원합니다. 그래서, 영어로 번역 :

( -o) 다음 "까지 "id" (any number of spaces):(any number of spaces)" 후 나에게 텍스트를 제공합니다. 귀하의 id 값입니다. 당신은 적절한 도구를 사용한다 PCRE

+0

나는 않을 것 사용자가 JSON 지원을 어색하게 다시 구현해야하기 때문에 이러한 종류의 작업을 위해'grep '을 사용하도록 권장하십시오. 2. -P는 실험적인 기능입니다. –

+1

예 .. -P는 내 시스템에서 사용할 수 없습니다. –

+3

@ ÉdouardLopez 당신은 대답을 downvote 수, 아무 문제. 그러나 당신의 코멘트를 위해. 1) 질문의 제목을 읽고 ** grep **이 분명히 있습니다. 나는 OP가 왜 그의 grep 라인이 작동하지 않는지 알게한다. 2) json. 나는 OP의 질문에서 단일 "json"을 보지 못한다. 당신은 json이라고 추측 할 수있다. 하지만 OP가 그렇다고 말할 수 없다면, 확실히 말할 수는 없습니다. 삼).-P는 편리하지만 모든 grep이 가지고있는 것은 아닙니다. ''jq''에 대해 어떻습니까? 나는 그것을 설치하지 않았다. – Kent

4

를 사용

-P 수단은 JSON 데이터, 예를 들어, 작업하기 awk/grep/sed와 JSON을 구문 분석하려고 jq (가볍고 유연한 명령 줄 JSON 프로세서는) 항상이 JSON 형식을 "이해"하지 않는 나쁜 생각입니다.

echo '{ "id" : "0cba-2dbc-11e4-8c2c-bb68" }' | jq '.id' 
"0cba-2dbc-11e4-8c2c-bb68" 
+0

@AvinashRaj bold는 강조하기 위해 사용됩니다 –

+0

+1, 파서를 사용하는 것이 더 낫습니다 ... 그리고 간단합니다 ... –

+0

+1을 단순화했습니다. 하지만이 경우에는 jq 도구를 사용할 수 없습니다. –

1

그냥 파이프로 출력 :

some-command | awk -F '[{}: ]+' '{gsub(/"/, "")} $2=="id"{print $3}' 
0cba-2dbc-11e4-8c2c-bb68 
+1

이것은 작동합니다. 코드를 설명해 주시겠습니까? –

+1

예. 이것은'[{} :]'문자 중 하나 이상인 사용자 정의 필드 분리자를 사용합니다. 'gsub'는 모든 큰 따옴표를 제거합니다. 그리고 마지막으로'$ 2 == "id"는'$ 3'이'id'인지 평가하고, 참이면 문자열'0cba-2dbc-11e4-8c2c-bb68' – anubhava

0

또 다른 방법. grep`/

echo '{ "id" : "0cba-2dbc-11e4-8c2c-bb68" }' | awk '{print $4}' | sed 's/["]//g' 

반환`awk` /과 JSON을 구문 분석하려고

0cba-2dbc-11e4-8c2c-bb68 
관련 문제