문제
내가 사용하려는 공간으로 구분과 cut
명령입니다.
어떤 구문을 사용할 수 있는 이?
해결책
cut -d ' ' -f 2
여기서 2는 당신이 원하는 공간 지정 필드의 필드 번호입니다.
다른 팁
일반적으로 공간을 구분 기호로 사용하는 경우 여러 공간을 하나로 취급하려고합니다. 일부 열을 공백과 정렬하는 명령의 출력을 구문 분석하기 때문입니다. (그리고 Google 검색을 위해 여기로 나를 이끌어냅니다)
이 경우 단일 cut
명령은 충분하지 않으므로 사용해야합니다.
tr -s ' ' | cut -d ' ' -f 2
또는
awk '{print $2}'
기존의 유용한 답변을 보완하기 위해; 모자 끝 QZ 지원 별도의 답변을 게시하도록 격려하기 위해 :
두 가지 뚜렷한 메커니즘 여기에 오십시오 :
(a) 여부
cut
그 자체 구분 기자 (공간,이 경우)가-d
옵션 옵션 별도의 인수 또는 그것을 추가하는 것이 허용되는지 여부 곧장 에게-d
.(b) 어떻게 껍데기 일반적으로 인수를 호출하기 전에 인수를 전달하기 전에 논쟁을 구문 분석합니다.
(a) 유틸리티에 대한 POSIX 지침 (강조 광산)
표준 유틸리티의 개요가 필수적인 옵션 관습 [...] 준수 응용 프로그램 사용한다 분리된 해당 옵션에 대한 인수 및 옵션 관점. 하지만, 준수 구현이 있어야한다 또한 문자를 개입하지 않고 동일한 인수 문자열에 옵션 및 옵션 학습을 지정하도록 응용 프로그램이 허용됩니다..
다시 말해 :이 경우, 왜냐하면 -d
옵션 관습입니다 필수적인, 당신은 할 수 있습니다 선택하다 구분자를 지정할지 여부:
- (s) 중 하나 : a 분리된 논쟁
- (d) 또는 값으로 직접 첨부 에게
-d
.
(S) 또는 (D)를 선택하면 껍데기의 문자열 - 문자 구문 분석 - (b) - 중요 :
접근 방식 (에스), 다음 모든 양식은 다음과 같습니다.
-d ' '
-d " "
-d \<space> # <space> used to represent an actual space for technical reasons
접근 방식 (디), 다음 모든 양식은 다음과 같습니다.
-d' '
-d" "
"-d "
'-d '
d\<space>
동등성은 다음과 같이 설명됩니다 껍데기문자열 지표 처리 :
모두 위의 솔루션이 발생합니다 똑같은 문자열 (각 그룹에서) 시간 cut
그들을 본다:
(에스):
cut
본다-d
, 그대로 소유하다 논쟁, 그 뒤에 a 분리된 우주 문자가 포함 된 인수 - 인용문이 없거나\
접두사!.(디):
cut
본다-d
...을 더한 우주 문자 - 인용문이없는 또는\
접두사! -의 일부로 같은 논쟁.
각 그룹의 양식이 궁극적으로 동일하는 이유는 어떻게 껍데기 구문 분석 문자열 리터럴:
- 쉘은 리터럴을 지정할 수 있도록합니다 그대로 ~을 통해 호출되는 메커니즘 인용, 걸릴 수 있습니다 여러 형태:
- 단일 크기 문자열 : 내부 내용
'...'
촬영됩니다 문자 그대로 그리고 형태 a 하나의 논쟁 - 이중 인용 문자열 : 내부 내용
"..."
또한 형성 a 하나의 논쟁이지만 그에 따릅니다 보간 (변수 참조를 확장합니다$var
, 명령 대체 ($(...)
또는`...`
) 또는 산술 확장 ($(( ... ))
). \
-인용 개인 캐릭터: ㅏ\
단일 문자 앞에 해당 캐릭터가 문자 그대로 해석됩니다.
- 단일 크기 문자열 : 내부 내용
- 인용문은 보완됩니다 견적 제거, 일단 쉘이 명령 줄을 구문 분석 한 후 제거합니다 인용 인용 인증서 (둘레를 둘러싸고 있습니다
'...'
또는"..."
또는\
인스턴스) - 따라서 호출되는 명령은 인용 문자를 보지 못합니다.
당신은 또한 말할 수 있습니다
cut -d\ -f 2
백 슬래시 다음에 두 개의 공간이 있습니다.
나 방금 발견되었습니다 당신도 사용할 수 있습니다 "-d "
:
cut "-d "
테스트
$ cat a
hello how are you
I am fine
$ cut "-d " -f2 a
how
am
짧은 꼬리, 컷 같은 유틸리티 (똑똑하지만 느리게 만든). 공백을 깨는 것은 기본값이지만 다중 문장, 대체 Regexes 등을 깨뜨릴 수도 있습니다.
scut -f='6 2 8 7' < input.file > output.file
따라서 위의 명령은 공백에서 열을 나누고 그 순서대로 (0 기반) cols 6 2 8 7을 추출합니다.
당신은 그것을 할 수 없으로 쉽게 절단하는 경우에 데이터가 예를 들어 여러 공간이 있습니다.나는 그것을 발견한 유용한 정규화하는 입력한 쉽게 처리합니다.중 하나를 사용하는 방법에 대한 sed 정상화는 다음과 같습니다.
echo -e "foor\t \t bar" | sed 's:\s\+:\t:g' | cut -f2 #bar
나는 대답이있다 (나는 다소 혼란스러운 대답을 인정한다)sed
, 정기적 인 표현 및 캡처 그룹 :
\S*
- 첫번째 단어\s*
- 분리기(\S*)
- 두 번째 단어 - 캡처.*
- 나머지 라인
A로 sed
표현, 캡처 그룹은 탈출해야합니다. \(
그리고 \)
.
그만큼 \1
캡처 된 그룹의 사본, 즉 두 번째 단어를 반환합니다.
$ echo "alpha beta gamma delta" | sed 's/\S*\s*\(\S*\).*/\1/'
beta
이 답을 살펴보면 다소 혼란스럽고 왜 귀찮게 생각할까요? 글쎄, 나는 일부 사람들이 "아하!" 이 패턴을 사용하여 하나의 복잡한 텍스트 추출 문제를 해결합니다. sed
표현.