このtr -s ' '
オプションでは、先頭のスペースが1つも削除されないことに注意してください。列が右揃えの場合(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
次に、3番目の列を出力します。私のコメントに示されているように...
パイプ読み取りは、呼び出し元のスクリプトに変数を渡さない環境で実行されます。
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でのみ機能します。ダッシュとアッシュはそれをサポートしていません。Busyboxで文字列をコンポーネントに分割するのに本当に苦労しました。単一のコンポーネントを取得して(たとえばawkを使用して)、必要なすべてのパラメーターに対してそれを繰り返すのは簡単です。しかし、同じ行でawkを繰り返し呼び出すか、同じ行でechoを使用して読み取りブロックを繰り返し使用することになります。これは効率的でもきれいでもありません。したがって、を使用して分割することになります ${name%% *}
等々。慣れ親しんだ機能の半分以上がなくなった場合、実際にはシェルスクリプトはそれほど楽しくないため、Pythonのスキルに憧れます。しかし、Pythonでさえそのようなシステムにインストールされないと想定することができ、そうではありませんでした;-)。