0

bashコマンドを起動すると、これが得られます

--> '044'    0       ''                               0        
 1> ''                                0         0

これは 1 つのレジスタです。より多くのレジスタを取得します。すべてのレジスタを 1 行に表示するにはどうすればよいですか? 可能であれば、値を1つのスペースだけで区切って表示するにはどうすればよいですか?

これ欲しい:

'044' 0 '' 0 '' 0 0

さて、私はすべてのコマンドを入れました。これを使用して機能しないでください:

cdmao;(echo "SELECT nulog FROM POSTE WHERE numan='5512204';"|cuser|grep "\--"|grep -v nulog|cut -    c5-11;)|while read poste_id;do echo "SELECT key_id,genrtou,chiftp, sonsurson, mnemo, order_mla, key_mla FROM KEYBOARD WHERE poste_id='$poste_id';"|cuser| tr -s ' ' | 
while read line; do 
  if [[ $i == 1 ]]; then 
    echo -n "$line"; 
    let i+=1; 
  else 
    echo " $line"; 
    let i-=1; 
  fi; 
done

私は何も受け取らない:これだけ>、コマンドを終了しない

4

3 に答える 3

1

最初の数文字も出力の一部であると仮定しますが、解決策はそれに依存しません。

余分なスペースを削除するには、 を使用できますtr -s。これにより、渡された文字の繰り返しが削除されます。変更されていないものと tr-ed の出力を比較します (どちらの場合も 3 行目と 4 行目)。

lynx@mobilis gemrb 0 $ echo "--> '044'    0       ''                               0        
>  1> ''                                0         0"
--> '044'    0       ''                               0        
 1> ''                                0         0
lynx@mobilis gemrb 0 $ echo "--> '044'    0       ''                               0        
 1> ''                                0         0" | tr -s ' '
--> '044' 0 '' 0 
 1> '' 0 0

したがって、残っているのはその改行を削除することだけです。tr( for delete )でもそれを行うことができますが-d、次のレジスタから文字列を区切る改行も削除します。

これらのレジスタ ダンプがどれほど安定しているかはわかりません。そのため、正規表現を使用しないソリューションを次に示します。2 行ごとにのみ改行を含む行を出力するだけです。

i=1 
echo "--> '044'    0       ''                               0        
 1> ''                                0         0" | tr -s ' ' | 
while read line; do 
  if [[ $i == 1 ]]; then 
    echo -n "$line"; 
    let i+=1; 
  else 
    echo " $line"; 
    let i-=1; 
  fi; 
done
--> '044' 0 '' 0 1> '' 0 0

echo 'long register dump'それを使用するには、文字列をレジスタ ダンパー プログラムに置き換えるだけです。

編集:それがコマンドチェーン全体である場合は、それらをグループ化する必要があります。そうしないと、出力の一部がフィルターによってキャッチされません。しかし、初期化のためだけだと思いcdmaoます(そうでない場合は、すべてを別のサブシェルまたは中括弧に追加してください)?

主な問題は、while ループを完了していないことです (doneどこかに抜けています)。正しく配置されたかどうかはわかりませんが、これを試してください:

cdmao;
(echo "SELECT nulog FROM POSTE WHERE numan='5512204';"|cuser|grep "\--"|grep -v nulog|cut -    c5-11;) | 
while read poste_id; do
  echo "SELECT key_id,genrtou,chiftp, sonsurson, mnemo, order_mla, key_mla FROM KEYBOARD WHERE poste_id='$poste_id';"; 
done |cuser| tr -s ' ' | 
while read line; do 
  if [[ $i == 1 ]]; then 
    echo -n "$line"; 
    let i+=1; 
  else 
    echo " $line"; 
    let i-=1; 
  fi; 
done

よりきれいな方法で実行できますが、関連するコマンドの一部がわからないため、あなたのバージョンに近づけました。とにかく、いくつかの書式設定と構文エラーを使用すると、はるかに見つけやすくなります。

于 2012-11-21T18:42:40.633 に答える
0
your command | cut -d '>' -f 2- | paste - - | awk '{$1=$1;print}'
于 2012-11-21T23:49:58.860 に答える
0

これにより、出力内の余分なスペースと改行がすべて削除されます。

your_command_here | tr '\n' ' ' | sed "s/[ ]*/ /g" 

コマンドからの出力の一部が stdout に加えて stderr に書き込まれる場合は、次のようにします。

your_command_here 2>&1 | tr '\n' ' ' | sed "s/[ ]*/ /g" 
于 2012-11-21T18:35:51.230 に答える