programing

bash: 출력의 n번째 열을 얻는 가장 빠른 방법

mailnote 2023. 4. 16. 15:29
반응형

bash: 출력의 n번째 열을 얻는 가장 빠른 방법

를 들어, 중에 bash의 이 경우 bash를 때에서 다음과 같은 합니다.svn st 작업 내) : Rails 작업 디렉토리:

?       changes.patch
M       app/models/superman.rb
A       app/models/superwoman.rb

명령어 출력(이 경우 파일 이름)으로 작업하려면 다음 명령어의 입력으로 두 번째 열을 사용할 수 있도록 구문 분석이 필요합니다.

하고 은 '우리'를 사용하는 입니다.awk예를 들어 모든 파일을 삭제하는 경우(일반적인 사용 사례가 아님)에는 다음 작업을 수행합니다.

svn st | awk '{print $2}' | xargs rm

제가 이것을 많이 치기 때문에, 당연한 질문입니다: 이것을 bash에서 실현하는 더 짧은(따라서 쿨한) 방법이 있을까요?

메모: 제가 묻고 있는 것은 기본적으로 셸 명령어 질문입니다.구체적인 예는 svn 워크플로우에 있습니다.이 워크플로우가 어리석다고 생각되어 다른 방법을 제안한다면 반대하지 않을 수 있지만, 여기서의 질문은 bash에서 n번째 열 명령어의 출력을 가능한 한 짧은 방법으로 얻는 방법이기 때문에 다른 사람들은 반대하지 않을 수 있습니다.감사합니다:)

를 사용하여 두 번째 필드에 액세스할 수 있습니다.

cut -f2

편집: 죄송합니다.SVN이 출력에 탭을 사용하지 않는 것을 몰랐습니다.그것은 조금 쓸모가 없습니다. 제작이 합니다.cut 깨지기 같아요. 를 들면, '어느 쪽인가' 같은 죠.cut -c 10-동작하지만, 정확한 값은 설정에 따라 달라집니다.

다른 '먹다'와 같은 것입니다.sed 's/.\s\+//'

다음과 같은 작업을 수행합니다.

svn st | awk '{print $2}' | xargs rm

사용할 수 있는 bash만 사용:

svn st | while read a b; do rm "$b"; done

물론 짧지는 않지만 파일 이름의 공백을 올바르게 처리할 수 있습니다.

버렸습니다만, 이 을 제 에일리어스에 ..profile 삭제:

alias c1="awk '{print \$1}'"
alias c2="awk '{print \$2}'"
alias c3="awk '{print \$3}'"
alias c4="awk '{print \$4}'"
alias c5="awk '{print \$5}'"
alias c6="awk '{print \$6}'"
alias c7="awk '{print \$7}'"
alias c8="awk '{print \$8}'"
alias c9="awk '{print \$9}'"

이렇게 쓸 수 있습니다.

svn st | c2 | xargs rm

zsh를 사용해 보세요.서픽스 에일리어스를 지원하므로 .zshrc에서 X를 정의할 수 있습니다.

alias -g X="| cut -d' ' -f2"

다음 작업을 수행할 수 있습니다.

cat file X

한 단계 더 나아가 n번째 열에 대해 정의할 수 있습니다.

alias -g X2="| cut -d' ' -f2"
alias -g X1="| cut -d' ' -f1"
alias -g X3="| cut -d' ' -f3"

파일 "file"의 n번째 열을 출력합니다.이 작업은 GREP 출력 이하에서도 실행할 수 있습니다.이것은 매우 편리하고 zsh의 특징입니다.

한 걸음 더 나아가 D를 다음과 같이 정의할 수 있습니다.

alias -g D="|xargs rm"

이제 다음을 입력할 수 있습니다.

cat file X1 D

파일 "file"의 첫 번째 열에 언급된 모든 파일을 삭제합니다.

bash를 알고 있다면 zsh는 몇 가지 새로운 기능을 제외하고는 큰 변화가 없습니다.

HTH 크리스

스크립트에 익숙하지 않은 것 같기 때문에 예를 들어 보겠습니다.

#!/bin/sh
# usage: svn st | x 2 | xargs rm
col=$1
shift
awk -v col="$col" '{print $col}' "${@--}"

을 「」에 .~/bin/x 꼭 해 주세요.~/bin 안에 요.PATH, 수 , 합니다..bashrc) n,x x n을 일반적으로 하기 위해 할 수 있습니다

이 스크립트는 숫자가 아닌 인수나 잘못된 수의 인수 등을 사용하여 호출된 경우 적절한 오류 체크와 베일을 수행해야 합니다.단, 이 베어본의 필수 버전에 대한 확장은 유닛 102에 포함됩니다.

스크립트를 확장하여 다른 열 구분 기호를 사용할 수 있습니다.다른 딜리미터를 하려면 , 「」를 사용합니다. 다른 구분 기호를 사용하려면 다음과 같이 하십시오.-F ':'서 ''는:는 새로운 딜리미터입니다.이것을 스크립트에 옵션으로 실장하면 조금 길어지기 때문에, 독자의 연습으로서 남겨 둡니다.


사용.

된 파일 " " "file:

1 2 3
4 5 6

stdin을 통해 전달할 수 있습니다(쓸데없는 을 단순히 더 유용한 것에 대한 플레이스 홀더로 사용).

$ cat file | sh script.sh 2
2
5

또는 스크립트의 인수로 지정합니다.

$ sh script.sh 2 file
2
5

서서,,sh script.sh가 "이렇게 저장되어 하고 있습니다.script.sh디렉토리에서 한 PATH 실행 한 것으로 no no no no no name instead 、 no no name 、 no no 설 and and 、 no 설 and and and 、 no and and and 、 no 、 no able and and and and 、 no 、 no able and and and and and and 、 no 、 no 、 no and and and and and and and and 、 no 、 no 、 no able andsh를 참조해 주세요.

이미 해결책을 가지고 계신 것 같군요.쉽게 하기 위해 명령어를 bash 스크립트로 입력하고(짧은 이름을 사용하여) 매번 '긴' 명령어를 입력하지 않고 실행하면 어떨까요?

수동으로 열을 선택할 수 있는 경우 pick을 사용하여 매우 빠르게 열을 선택할 수 있습니다.

svn st | pick | xargs rm

칸의 됩니다.c 그음음음 and를 누릅니다.enter

이 파일 경로는 svn st 출력의 두 번째 열에 있을 필요는 없습니다.예를 들어 파일을 수정하고 해당 속성을 수정하면 세 번째 열이 됩니다.

다음의 출력 예를 참조해 주세요.

svn help st

출력 예:

 M     wc/bar.c
A  +   wc/qax.c

처음 8자를 잘라내는 방법은 다음과 같습니다.

svn st | cut -c8- | while read FILE; do echo whatever with "$FILE"; done

예를 들어 마지막에 공백이 있는 고급 파일 이름을 처리하는 경우 xml 출력을 해석해야 합니다.

svn st --xml | grep -o 'path=".*"' | sed 's/^path="//; s/"$//'

물론 grep/sed 대신 실제 XML 파서를 사용할 수도 있습니다.

언급URL : https://stackoverflow.com/questions/7315587/bash-shortest-way-to-get-n-th-column-of-output

반응형