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

标签 linux bash shell grep

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

相关文章:

python - 将 google cloud speech api 与 tornado 服务器一起使用时出现多个 CLOSE_WAIT。打开的文件太多错误

linux - 如何从 web 发送参数或指令到 linux 机器并在 web 中显示结果?

bash - *将所有变量从 key=value 文件导出到 shell

c - 如何在 Linux 中检查信号处理程序

Bash/C shell : Are there any drawbacks about escaping all characters of a file path?

linux - 意外的 Shell 脚本错误

linux - grep 遍历数千个 gz 文件的最快方法?

linux - select vs poll vs epoll

linux - 使用 Apache httpd.conf 文件的 Docker 卷权限

linux - 从base64解码并执行命令