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



当我启动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

我什么都没收到:只有这个>,没有完成命令

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

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

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(-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

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

这应该会删除输出中所有多余的空格和换行符:

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

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

your_command_here 2>&1 | tr 'n' ' ' | sed "s/[ ]*/ /g" 
your command | cut -d '>' -f 2- | paste - - | awk '{$1=$1;print}'

相关内容

  • 没有找到相关文章

最新更新