【问题标题】:How to read a file and get certain lines in Linux如何在 Linux 中读取文件并获取某些行
【发布时间】:2021-02-09 14:00:25
【问题描述】:

我有一个文件,它的内容如下:


abc.com.        IN A            10.10.40.94 ;10.120.40.61    ;10.60.3.135
def.com.            IN CNAME        some-domain.com.

xyz.com.        IN A            10.123.40.32    ;10.145.40.133    ;1.240.3.215
one.com.                IN CNAME        some-other-domain.com.

我想要做的是,使用IN A 获取所有行并将它们打印到另一个文件,以便最终文件如下所示:

我试过awk如下:

cat dev-mytaxi.com.zone | awk '{print $3}'

但是我怎样才能写入文件和下面提到的最终结果?

写入新文件的最终输出应如下所示:

abc.com 10.10.40.94 10.120.40.61 10.60.3.135
xyz.com 10.123.40.32 10.145.40.133 1.240.3.215

【问题讨论】:

  • 欢迎来到 SO。特别感谢您的努力,您能否让我们知道在您的问题中获取示例输出的逻辑是什么。
  • 要写入文件,您只需要>your command > file 会将您的命令输出写入您工作目录中名为file 的文件中。

标签: regex linux bash awk


【解决方案1】:
awk '/IN A/ { match($1,/^;/);printf "%s %s ",substr($1,RSTART+RLENGTH),$4;for (i=5;i<=NF;i++) { printf "%s ",substr($i,2) } printf "%s","\n" }' ipdat > ipdat1

使用上面的 awk 命令和一个名为 ipdat 的文件中的源数据,我们搜索字符串“IN A”,然后相应地处理该行。我们采用第 1 和第 4 分隔字段并以空格作为分隔符进行打印。然后我们使用 awk 的 substr 函数获取第 5、第 6 和第 7 个分隔字段,从第二个字符开始打印以去除第一个“;”特点。所有输出都被重定向到另一个文件(在本例中为 ipdat1)

【讨论】:

  • 如何去掉某些域名前面的;
  • 我已经修改了 find 的答案;域名中的前缀,然后删除 ;相应地。
  • 谢谢。有一个问题,我不想总是使用substr($5,2)substr($6,2)substr($8,2),因为ips 可以在1-6 ips 之间变化。在这种情况下,我可能需要添加substr($9,2)substr($10,2) 等等...我该如何摆脱它?
  • 添加附加代码以考虑 IP 地址的最大数量。然后那些带有额外 IP 地址的行将打印额外的 IP 地址,那些没有的不会
  • 这就是我DON'T想做的事情
【解决方案2】:

你可以试试这个更简单的awk 和自定义FS

awk -F '[.[:blank:]]+IN A[[:blank:]]+' 'NF > 1 {
gsub(/[;[:blank:]]+/, " ", $2); print $1, $2}' file
abc.com 10.10.40.94 10.120.40.61 10.60.3.135
xyz.com 10.123.40.32 10.145.40.133 1.240.3.215

工作原理:

  • 在这里,我们使用正则表达式 [.[:blank:]]+IN A[[:blank:]]+ 作为输入字段分隔符,它用 IN A 文本分割每条记录,并在两边用空格包围。
  • NF &gt; 1 仅适用于具有 IN A 记录的行
  • gsub 转换多个空格,; 在 ip 地址之间使用单个空格

【讨论】:

  • 感谢分享好代码,请问您是否可以在这里添加正则表达式标签,因为您在这里编写了很好的正则表达式,您说什么先生?因为根据建议,标签也应该根据答案和问题来决定。
  • @RavinderSingh13:是的,我认为我们可以添加该标签,因为两个答案都使用基于正则表达式的方法。
【解决方案3】:

perl

$ perl -lne 'BEGIN{$,=" "} print /^(\S+?)\.?\s/, /\d+(?:\.\d+){3}/g if /IN A/' ip.txt
abc.com 10.10.40.94 10.120.40.61 10.60.3.135
xyz.com 10.123.40.32 10.145.40.133 1.240.3.215
  • $,=" " 设置要在传递给 print 的多个参数/数组之间使用的分隔符
  • if /IN A/ 如果输入行包含IN A
  • /^(\S+?)\.?\s/ 获取起始非空白字符,如果存在则忽略尾随 .
  • /\d+(?:\.\d+){3}/g 这将得到由 . 字符分隔的所有 4 个数字的序列

【讨论】:

  • perl 是什么?图书馆?
  • @JananathJayarathna 是一种类似于awk 的编程语言,也可以在命令行中使用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多