当我启动 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
我没有收到任何东西:只有这个>,没有完成命令
最佳答案
我假设前几个字符也是输出的一部分,但解决方案不依赖于它。
要删除多余的空格,您可以使用 tr -s
,这将删除重复的传递字符。将 unchanged 与 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
来做到这一点(-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
它可以用更漂亮的方式完成,但我不知道涉及的一些命令,所以我让它接近你的版本。无论如何,使用一些格式和语法错误会更容易发现。
关于linux - 如何使用 grep、awk 等在 1 中显示 2 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13499830/