작업 중에 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
두 번째 필드에 액세스하는 데 사용할 수 있습니다 .
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’명령을 입력하는 대신 실행하는 것이 어떻습니까?