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
'programing' 카테고리의 다른 글
| MVVM을 사용한WPF 대화상자 처리 (0) | 2023.04.16 |
|---|---|
| SQL Server의 LIMIT 및 OFFSET과 동등합니까? (0) | 2023.04.16 |
| Spring Boot 3 springdoc-openapi-ui가 작동하지 않음 (0) | 2023.04.16 |
| 단순성 유지 및 쿼리에서 여러 CTE를 수행하는 방법 (0) | 2023.04.16 |
| '프로젝트 이름'이 최적화로 컴파일되었습니다.스텝 동작이 이상할 수 있습니다.변수를 사용할 수 없습니다. (0) | 2023.04.16 |