[bash] bash : n 번째 출력 열을 얻는 가장 짧은 방법

작업 중에 bash의 일부 명령에서 다음과 같은 열 형식의 출력이 반복적으로 발생한다고 가정합니다 (제 경우에는 svn stRails 작업 디렉토리 에서 실행 ).

?       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두 번째 필드에 액세스하는 데 사용할 수 있습니다 .

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 n.

숫자가 아닌 인수 또는 잘못된 수의 인수 등으로 호출 된 경우 스크립트는 적절한 오류 검사를 수행해야합니다. 이 베어 본 필수 버전을 확장하면 단위 102가됩니다.

다른 열 구분 기호를 허용하도록 스크립트를 확장하고 싶을 수도 있습니다. 기본적으로 Awk는 입력을 공백의 필드로 구문 분석합니다. 다른 분리 문자를 사용 하려면 새 분리 문자가있는 -F ':'위치를 사용 :하십시오. 이것을 스크립트의 옵션으로 구현하면 약간 길어 지므로 독자에게 연습으로 남겨 두겠습니다.


용법

주어진 파일 file:

1 2 3
4 5 6

stdin을 통해 전달할 수 있습니다 ( 무용cat 한 것을 더 유용한 것에 대한 자리 표시 자로 사용 ).

$ cat file | sh script.sh 2
2
5

또는 스크립트에 대한 인수로 제공하십시오.

$ sh script.sh 2 file
2
5

여기서는 sh script.sh스크립트가 script.sh현재 디렉토리와 같이 저장되었다고 가정합니다 . PATH위의 지침에서 와 같이 더 유용한 이름으로 저장하고 실행 파일로 표시하면 유용한 이름을 대신 사용하십시오 (및 no sh).


답변

이미 해결책이있는 것 같습니다. 일을 더 쉽게하기 위해 명령을 bash 스크립트 (짧은 이름으로)에 넣고 매번 ‘long’명령을 입력하는 대신 실행하는 것이 어떻습니까?


답변

열을 수동으로 선택해도 괜찮다면 pick을 사용하면 매우 빠를 수 있습니다 .

svn st | pick | xargs rm

두 번째 열의 셀로 이동하여을 누른 c다음enter