Linux 如何使用grep、awk等在1中显示2行

Linux 如何使用grep、awk等在1中显示2行,linux,bash,shell,grep,Linux,Bash,Shell,Grep,当我启动bash命令时,我得到 --> '044' 0 '' 0 1> '' 0 0 这是一个寄存器,我得到更多寄存器,如何在一行中显示每个寄存器?如果可能的话,如何用1个空格分隔值来显示 我想要这个: '044' 0 '' 0 '' 0 0 好吧,我把所有的命令都放进去了,不要用这个: cdmao;(ec

当我启动bash命令时,我得到

--> '044'    0       ''                               0        
 1> ''                                0         0
这是一个寄存器,我得到更多寄存器,如何在一行中显示每个寄存器?如果可能的话,如何用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

我什么也没有收到:只有这个>,not finish命令

这应该删除输出中的所有额外空格和换行符:

your_command_here | tr '\n' ' ' | sed "s/[ ]*/ /g" 
如果命令的部分输出除了stdout之外还写入了stderr,请执行以下操作:

your_command_here 2>&1 | tr '\n' ' ' | sed "s/[ ]*/ /g" 

我假设前几个字符也是输出的一部分,但解决方案并不依赖于它

要删除额外的空格,可以使用
tr-s
,这将删除重复传递的字符。将未更改的输出与tr ed输出进行比较(两种情况下的第三行和第四行):

所以唯一剩下的就是删除那条新行。您也可以使用
tr
-d
表示删除),但是您还可以删除将字符串与下一个寄存器分隔的换行符

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

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

它可以用一种更漂亮的方式完成,但我不知道其中涉及的一些命令,所以我将它与您的版本保持一致。无论如何,使用一些格式和语法错误将更容易发现。

使用这些我得到了以下结果:->'0 4 4'0''0 1>''0 0 0不起作用,在1 linea中显示相同的内容,但所有1 linea,请参见lynx的答案,1寄存器2行,但我收到50多个寄存器,u全部删除\n,1行中的所有寄存器与
tr'\n'.\sed“s/[]*//g”
功能相同,只需通过
xargs echo
即可实现。我拉所有命令,因为我不知道如何将您的命令与我的命令放在一起
your command | cut -d '>' -f 2- | paste - - | awk '{$1=$1;print}'
your command | cut -d '>' -f 2- | paste - - | awk '{$1=$1;print}'