이 tr -s ' '
옵션은 단일 선행 공백을 제거하지 않습니다. 열이 오른쪽 정렬 된 경우 ( ps
pid 와 같이 ) ...
$ ps h -o pid,user -C ssh,sshd | tr -s " "
1543 root
19645 root
19731 root
그런 다음 절단하면 해당 필드 중 일부가 첫 번째 열인 경우 빈 줄이 생깁니다.
$ <previous command> | cut -d ' ' -f1
19645
19731
앞에 공백이 없으면 분명히
$ <command> | sed -e "s/.*/ &/" | tr -s " "
이제 이름이 아닌 pid 숫자의이 특별한 경우에 다음과 같은 함수가 있습니다 pgrep
.
$ pgrep ssh
쉘 기능
그러나 일반적 으로 명령 에 대한 깔끔한 점이 있기 때문에 실제로는 간결한 방식으로 쉘 함수 를 사용할 수 있습니다 read
.
$ <command> | while read a b; do echo $a; done
읽을 첫 번째 매개 변수 a
는 첫 번째 열을 선택하고 더 많은 항목 이있는 경우 다른 모든 항목 이에 입력됩니다 b
. 결과적으로 +1 열의 수보다 더 많은 변수가 필요하지 않습니다. .
그래서,
while read a b c d; do echo $c; done
그런 다음 세 번째 열을 출력합니다. 내 의견에 표시된대로 ...
파이프 된 읽기는 호출 스크립트에 변수를 전달하지 않는 환경에서 실행됩니다.
out=$(ps whatever | { read a b c d; echo $c; })
arr=($(ps whatever | { read a b c d; echo $c $b; }))
echo ${arr[1]}
어레이 솔루션
그래서 우리는 @frayser의 대답으로 끝납니다. 이것은 기본적으로 공백을 사용하는 쉘 변수 IFS를 사용하여 문자열을 배열로 분할하는 것입니다. 그래도 Bash에서만 작동합니다. Dash와 Ash는이를 지원하지 않습니다. Busybox의 구성 요소로 문자열을 분할하는 데 정말 어려움을 겪었습니다. 단일 구성 요소 (예 : awk 사용)를 얻은 다음 필요한 모든 매개 변수에 대해이를 반복하는 것은 쉽습니다. 그러나 그런 다음 동일한 라인에서 반복적으로 awk를 호출하거나 동일한 라인에서 echo가있는 읽기 블록을 반복적으로 사용합니다. 효율적이거나 예쁘지 않습니다. 그래서 당신은 ${name%% *}
등등. 익숙한 기능의 절반 이상이 사라지면 실제로 쉘 스크립팅이 더 이상 재미 있지 않기 때문에 일부 Python 기술을 갈망하게 만듭니다. 그러나 파이썬조차도 그러한 시스템에 설치되지 않을 것이며 ;-)가 아니라고 가정 할 수 있습니다.