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