대신 awk를 사용할 수 있습니까?


17

rating이 결과에서 숫자를 얻고 싶습니다.

# nc localhost 9571 
language:
language:en_ZA.UTF-8
language:en_ZW.UTF-8
session-with-name:Ubuntu Classic (No effects):gnome-session --session=2d-gnome
session-with-name:Ubuntu (Safe Mode):gnome-session -f --session=2d-gnome
session-with-name:Ubuntu Classic:gnome-session --session=classic-gnome
xsession:/etc/X11/Xsession
rating:94

이렇게 할 수 있습니다

# nc localhost 9571 | grep rating | cut -d: -f2
94

awk더 간단한 솔루션 대신 사용할 수 있습니까?


이 질문은 Awk 인터페이스에서의 프로그래밍에 관한 것이기 때문에 주제
Magellan

답변:


32
$ nc localhost 9571 | awk -F: '/rating/ { print $2 }'

7
필드 값 또는 이름 중 하나에 문자열 "rating"이 포함 된 경우 잘못된 결과를 제공 할 수 있습니다. 즉 세션 이름 중 하나에 "rating"이라는 단어가 있습니다. 더 나은 :awk -F: '$1 == "rating" {print $2}'
Ingmar Hupp

3
아니면 awk -F: '/^rating:/ { print $2 }'?
CVn

나는 그것을 알고 있지만 OP의 명령에 따라 변환합니다.
quanta

@ IngmarHupp 나는 정확히 같은 것을 생각했다. 사실이 변경 사항으로 답변을 편집 한 정확한 레코드와 일치시키는 것이 훨씬 좋습니다. 이것은 사람들이 awk를 더 효과적으로 사용하는 법을 배우는 데 도움이 될 것입니다.
Dan Molding

14

Quanta가 저를 이겼지 만, sed그런 식으로 기울이면 변형을 포함시킬 것입니다 .

nc localhost 9571 | sed -ne 's/^rating://p'

그러나 MadHatter가 말한 것을 Ditto. 현재 솔루션은 완벽합니다. ( "^rating:"단지 내가 원하는 줄만 얻을 수 있도록 단어가 아니라 grep 할 것입니다.)


나는 사랑한다 sed! 그것은 너무 활용도가 낮고 과소 평가됩니다 ...
Mei

9

쉘을 사용할 수도 있습니다.

nc localhost 9571 | 
while IFS=: read key val; do [[ $key = "rating" ]] && echo "$val"; done

이것은 가장 빠른 방법이며, 그 이상의 프로세스를 생성하는 것을 방지합니다 nc. 좋은!
Mei

7

예, 당신은 grep과 cut 대신에 awk를 사용할 수 있습니다.

$ nc localhost 9571 | awk -F: '/^rating:/ { print $2 }'

못생긴 버그를 피하기 위해 당신의 라인을 잘 일치시켜야합니다.

  • /rating/ 공장,
  • /^rating/ 더 나은 (safer),
  • /^rating:/ 최고입니다 (이 경우).

4

그것은 할 수 있습니다 :

nc localhost 9571  | awk -F: '{ if ($1 == "rating") print $2 }' 

(위의 localhost로 무엇을하고 있는지 알지 못하므로 출력을 내 awk 명령에 대한 입력으로 사용한 다음 "cat"을 "nc ..."로 바꾸십시오.하지만 괜찮습니다.

근데 왜 이래? 유닉스의 방법 은 큰 도구를 사용하는 것이 아니라 파이프 라인을 통해 서로 연결되는 작은 도구가 많이있는 것입니다. 단일 매칭 라인의 하나를 선택 필드 그로부터 선택해야 grep일치과 선택 라인들, 및 cut입력 라인으로부터 선택 필드; 그들은 작업에 완벽합니다. 그러나 당신이 정말로 awk와 올인원을하고 싶다면, 거기 있습니다.


한 가지 이유는 두 개의 프로세스 를 사용 grep하고 cut생성해야하고 awk(또는 sed)을 사용하면 하나만 필요하기 때문입니다. 프로세스 스폰은 계산 비용이 많이 듭니다. 또한, 사용 달리 perl거나 ruby(외), sedawk업 프론트 훨씬 가볍다.
Mei

2
충분하지만 공정 (F15) 시스템에서 awk 바이너리의 크기는 360948 바이트이지만 grep 및 cut 바이너리는 170824입니다. 포크 + 실행이 하나 뿐이지 만 메모리가 많고 IO가 더 많은 사이클 바이너리를 디스크에서 꺼냅니다. 솔직히 말해서, 이러한 고려 사항 중 하나가 현대 시스템에서 중요하다는 것을 의심하지만, 최소화 해야하는 경우가 있습니다!
MadHatter는 Monica

Foo Bah : 수정 제안에 감사하지만 퀀 타는 내 제안보다 능률적 인 내 게시물보다 늦게 게시했습니다. 엔트리 레벨 awk 사용자가 작동 방식을 쉽게 볼 수 있기 때문에 편집을 거부했기 때문에 선호했습니다. 그래도 감사합니다!
MadHatter는 Monica

3

퀀 타의 답변이 가장 쉽고 답변도 있지만 GNU awk (gawk)도 네트워킹을 할 수 있다는 것을 몰랐 습니다 . 정말로 원하는 경우 awk로 전체 내용을 작성할 수 있습니다.

BEGIN {
    FS = ":"
    f = "/inet/tcp/0/127.0.0.1/9571"
    while ((f |& getline) > 0)
        if ($1 ~ /^rating$/) {print $2}
}

이것은 서버에 nc가 설치되어 있지 않거나 nc에 제한적인 perms가 있거나 awk를 정말로 좋아하는 경우에 유용 할 수 있습니다.


우우 좋은. 네트워킹 코 프로세싱 예.
Dr. Edward Morbius 2018 년

0

sed를 사용할 수도 있습니다.

nc localhost 9571 | sed -n "s/^rating:\([\d]*\)/\1/p"

이렇게하면 "등급"이 줄을 시작하고 숫자가 rating:


0

Perl이 옵션 인 경우 :

nc localhost 9571 | perl -F: -lane 'print $F[1] if /rating/'

-aautosplits로 각 라인 @F어레이
-F:용도 :필드 구분자 대신 공백의 기본
/rating/정규식이 발견 될 경우에 해당 복귀
$F[1]의 제 2 요소 @F어레이.
Perl 배열은 요소 0으로 시작하지만 awk는 $ 1로 시작합니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.