【问题标题】:Linux read file line by line, print regex and print everything between two patternsLinux逐行读取文件,打印正则表达式并打印两种模式之间的所有内容
【发布时间】:2020-05-22 12:10:00
【问题描述】:

我制作了这个脚本:

for i in  `cat PDV_List`
do echo $i
ssh $i /tmp/checkutilisateur.sh
done > hc_connesse
awk '/^+-------------+/{PTN=1} /^\(/{PTN=0} PTN' hc_connesse
echo "       "

hc_connesse 的输出是:

SE401 
INGRES TERMINAL MONITOR Copyright 2011 Actian Corporation
Ingres Linux Version II 10.1.0 (a64.lnx/126)GPL login 
Fri May 22 13:47:36 2020 
Enter \g to execute commands, "help help\g" for help, \q to quit

continue
* Executing . . .


+-------------+------------------------------+------+------+------+-------------+------+------+-------------------------+------+-------------------------+-------------------------+-------------------------+------+ 
|num          |nom                           |mdp   |numpro|numcai|numcle       |coffre|consig|datemodif                |matcv |cre_hot                  |deb_ctrl                 |fin_ctrl   |top_vi|
+-------------+------------------------------+------+------+------+-------------+------+------+-------------------------+------+-------------------------+-------------------------+-------------------------+------+ 
| some data here
+-------------+------------------------------+------+------+------+-------------+------+------+-------------------------+------+-------------------------+-------------------------+-------------------------+------+ 
(12 rows) continue
*  Your SQL statement(s) have been committed.

Ingres Version II 10.1.0 (a64.lnx/126)GPL logout 
Fri May 22 13:47:36 2020

我无法从 hc_connesse 打印 SE401。

查询是在 45 个不同的服务器上进行的,如果不将 SE04 放在表之前,将无法了解哪些数据来自哪里。

尝试了另一个循环,在另一个之前插入另一个 awk。

尝试将两个 awk 放在一条线上。

很可能我写错了什么,因为我对脚本所做的任何更改,控制台就像在等待输入。

您对如何打印 SE04 有任何想法吗?

【问题讨论】:

  • +在正则表达式中有特殊含义,需要转义。
  • 没有以( 开头的行,您希望与/^\(/ 匹配什么?
  • awk 'NR==1' file?
  • @Barmar 编辑了代码。缺少 CR。而且我可以在开头的 +----------------+ 和表格末尾的 +-------------+ 之间获得所有内容.
  • 您确定您在checkutilisateur.sh 中运行的任何命令都没有选项可以只为您提供所需的输出,因此您不必使用其他工具(如awk 稍后?看起来您将 stderr 与 stdout 混合在一起,并且您正在运行的任何查询都可能有选项。

标签: regex linux awk


【解决方案1】:

很难猜测问题的主体和标题之间的关系。如果我理解正确,您想打印第一行(SE 后跟数字)和数据库查询的输出。

试试:

for i in  `cat PDV_List`
do echo $i
  ssh $i /tmp/checkutilisateur.sh
done | tee hc_connesse | awk '/^SE/ || /^\+/ || /^\|/'
echo "       "

awk 在这里所做的是打印以SE+| 开头的每一行。如果您想要其他内容,请编辑您的问题以使其易于理解。

您可能不想保留hc_connesse 的副本。在这种情况下,只需从上面的命令中删除字符串 tee hc_connesse |

输出:

SE401 
+-------------+------------------------------+------+------+------+-------------+------+------+-------------------------+------+-------------------------+-------------------------+-------------------------+------+ 
|num          |nom                           |mdp   |numpro|numcai|numcle       |coffre|consig|datemodif                |matcv |cre_hot                  |deb_ctrl                 |fin_ctrl   |top_vi|
+-------------+------------------------------+------+------+------+-------------+------+------+-------------------------+------+-------------------------+-------------------------+-------------------------+------+ 
| some data here
+-------------+------------------------------+------+------+------+-------------+------+------+-------------------------+------+-------------------------+-------------------------+-------------------------+------+ 

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
  • 2014-05-27
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
相关资源
最近更新 更多