명령 출력에서 ​​두 번째 열을 얻는 방법?


152

내 명령의 출력은 다음과 같습니다.

1540 "A B"
   6 "C"
 119 "D"

첫 번째 열은 항상 숫자 다음에 공백이 있고 큰 따옴표로 묶인 문자열입니다.

내 목적은 다음과 같이 두 번째 열만 얻는 것입니다.

"A B"
"C"
"D"

나는 <some_command> | awk '{print $2}'이것을 달성 하기 위해 사용하려고했다 . 그러나 문제는 두 번째 열의 일부 값에 공백이 포함되어 있으며 이는 awk필드를 구분하기위한 기본 구분 기호입니다 . 따라서 출력이 엉망입니다.

"A
"C"
"D"

두 번째 열의 값 (따옴표와 함께)을 깨끗하게 얻으려면 어떻게해야합니까?



1
을 사용해 보았지만 awk '{$1=""; print $0}'여전히 공백 문자가 있습니다. 에 의해 제거 될 수 있습니다 sed '/^ //'. 그러나 이것이 가능 awk할까요?
Qiang Xu

답변:


29

또는 sed & regex를 사용하십시오.

<some_command> | sed 's/^.* \(".*"$\)/\1/'

시작 및 종료 마커가 필요하지 않으므로 cmd 단축 :<some_command> | sed 's/.* \(".*"\)/\1/'
Timo

197

s -F [field separator]에서 선을 분할하는 데 사용하십시오 ".

awk -F '"' '{print $2}' your_input_file

또는 파이프에서 입력

<some_command> | awk -F '"' '{print $2}'

산출:

A B
C
D

3
이것은 좋지만 원래 주변 인용문도 원합니다. 할 수 있었습니까? 감사.
Qiang Xu

5
당신은 속임수를 쓰고 awk의 프린트를 다음과 같이 변경할 수 있습니다'{print "\""$2"\""}'
Alex

그렇습니다. 고마워요, 알렉스! 그건 그렇고, 너무 많은 인용문 :)
Qiang Xu

@Alex, 큰 따옴표와 백 슬래시를 사용하여 op가 원하는 것을 얻는 방법을 설명해 주시겠습니까?
Timo

1
@Timo 따옴표 및 백 슬래시 분석은로 구상 될 수 있습니다 "\"" + $2 + "\"". 주변 인용 부호는 출력에 추가 될 내용을 나타내며 이스케이프 된 인용 부호 ( \")가 인쇄됩니다. 이를 시각화하기 위해 $2따옴표 대신 빈 공간을 추가하려는 경우 다음과 같이 표시 '{print " "$2" "}'됩니다. 또한 좀 더 쉽게 알아볼 수 있도록 형식 간격을 추가 할 수 있습니다.'{print " " $2 " "}'
Tom

80

'awk'이외의 다른 것을 사용할 수 있다면 대신 시도하십시오

echo '1540 "A B"' | cut -d' ' -f2-

-d 는 구분 기호이고, -f 는 절단 할 필드이며 -f2- 를 사용하면 끝까지 두 번째 필드를 절단하려고합니다.


이것은 다음을 수행하는 데 도움이되었습니다 (git에서 파일의 커밋 ID 가져 오기) : git annotate myfile.cpp | grep '2016-07'| 머리 -1 | cut -f1
serup

2
이것은 좋지만 분리 문자 길이가 두 자 이상인 경우 작동하지 않습니다. 그것이 awk 솔루션이 유용한 곳입니다
smac89

2
왜 공백이 사용되지 -d않습니까? 그런 식으로 조금 이상하게 보입니다.
Chris Stryczynski

43

명령 출력 "docker images"에서 특정 열을 가져 오려면 작동해야합니다.

REPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE
ubuntu                              16.04               12543ced0f6f        10 months ago       122 MB
ubuntu                              latest              12543ced0f6f        10 months ago       122 MB
selenium/standalone-firefox-debug   2.53.0              9f3bab6e046f        12 months ago       613 MB
selenium/node-firefox-debug         2.53.0              d82f2ab74db7        12 months ago       613 MB


docker images | awk '{print $3}'

IMAGE
12543ced0f6f
12543ced0f6f
9f3bab6e046f
d82f2ab74db7

이것은 세 번째 열을 인쇄합니다


도커 이미지를 봤습니까? awk '{print $ 5}'?
Shashi Ranjan

17

당신은 그것에 대해 awk가 필요하지 않습니다. readBash 쉘에서 사용하면 충분합니다.

some_command | while read c1 c2; do echo $c2; done

또는:

while read c1 c2; do echo $c2; done < in.txt

13

GNU awk가 있다면 이것이 원하는 솔루션입니다.

$ awk '{print $1}' FPAT='"[^"]+"' file
"A B"
"C"
"D"


0
#!/usr/bin/python
import sys 

col = int(sys.argv[1]) - 1

for line in sys.stdin:
    columns = line.split()

    try:
        print(columns[col])
    except IndexError:
        # ignore
        pass

그런 다음 스크립트의 이름을 co로 지정한다고 가정하면 파일 크기를 얻기 위해 이와 같은 작업을 수행하십시오 (예에서는 Linux를 사용한다고 가정하지만 스크립트 자체는 OS 독립적입니다) :-

ls -lh | co 5

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