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 输出(两种情况下的第三行和第四行)进行比较:

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( -dfor delete) 来执行此操作,但是您还将删除将字符串与下一个寄存器分开的换行符。

我不知道这些寄存器转储有多稳定,所以这里有一个不涉及正则表达式的解决方案——它只打印包含换行符的行,每行包含一次:

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只是为了进行一些初始化(如果不是,请将所有内容添加到另一个子shell或大括号中)?

主要问题是您没有完成 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_here | tr '\n' ' ' | sed "s/[ ]*/ /g" 

如果命令的部分输出除了 stdout 之外还写入 stderr,请执行以下操作:

your_command_here 2>&1 | tr '\n' ' ' | sed "s/[ ]*/ /g" 
于 2012-11-21T18:35:51.230 回答
0
your command | cut -d '>' -f 2- | paste - - | awk '{$1=$1;print}'
于 2012-11-21T23:49:58.860 回答