首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在shell脚本中解析文本文件

在shell脚本中解析文本文件
EN

Stack Overflow用户
提问于 2016-01-04 07:41:06
回答 2查看 118关注 0票数 0

我想读取一个文件,并使用using脚本将其打印到stdout。在python中,rsplit可以完成这项工作,但我搜索并找到awk,但我无法理解。

file1:

代码语言:javascript
复制
#begin cow
Host cow
    HostName 172.18.0.10
    User root
    Port 22
#end cow
#begin dns2
Host dns2
    HostName 172.20.4.80
    User root
    Port 22
#end dns2
#begin dns1
Host dns1
    HostName 172.20.4.75
    User root
    Port 22
#end dns1
#begin dns3
Host dns3
        HostName 172.20.4.76
        User root
        Port 22
#end dns3
#begin dns4
Host dns4
        HostName 172.20.4.77
        User root
        Port 22
#end dns4
#begin dns5
Host dns5
        HostName 172.20.4.78
        User root
        Port 22
#end dns5
#begin dns6
Host dns6
        HostName 172.20.4.79
        User root
        Port 22
#end dns6

在解析完它之后,

代码语言:javascript
复制
Host: cow  Hostname: 172.18.0.10 User: root Port: 22
Host: dns2 Hostname: 172.20.4.80 User: root Port: 22
Host: dns1 Hostname: 172.20.4.75 User: root Port: 22
Host: dns3 Hostname: 172.20.4.76 User: root Port: 22
Host: dns4 Hostname: 172.20.4.77 User: root Port: 22
Host: dns5 Hostname: 172.20.4.78 User: root Port: 22
Host: dns6 Hostname: 172.20.4.79 User: root Port: 22

在这件事上任何人都可以帮我谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-04 07:57:51

基于文本(假设结构是完整的(开始->结束),没有空行,.)

代码语言:javascript
复制
awk -v "Sep=\t" '/^#begin/{Infos="";next}/^#end/{print Infos;next}{Infos = Infos ($1~/^Host$/ ? "" : Sep) $1 ": " $2}' YourFile

Sep是信息子序列之间的分隔符。

过滤器也是如此(如果过滤器是相同的,只打印;如果宿主是牛或男孩)

代码语言:javascript
复制
awk -v "Sep=\t" -v"Filter=^cow$|^boy$" '
   /^#begin/{Infos="";PassFilter=0;next}
   /^#end/&&PassFilter{print Infos;next}
   $1~/^Host$/{PassFilter=$2~Filter}
   {Infos = Infos ($1~/^Host$/ ? "" : Sep) $1 ": " $2}
   ' YourFile

解释:

  • /^#begin/{Infos="";next}重置字符串以打印由`#begin开始的每一行,转到源文件的下一行(不要处理以下指令)。
  • /^#end/&&PassFilter{print Infos;next}当行以#end开头,变量PassFilter为true时(=1),打印Infos的字符串内容,转到源文件的下一行。
  • $1~/^Host$/{PassFilter=$2~Filter}当第一个单词为Host时,如果第二个单词包含/对应于Filter变量的正则表达式(在本例中为^cow$|^boy$),则变量PassFilter设置为true。
  • {Infos = Infos ($1~/^Host$/ ? "" : Sep) $1 ": " $2}将当前行的内容(首先($1),然后实际上是:,最后是第二个单词)添加到变量Infos中,使用分隔符if not line withHost`‘作为第一个单词。
票数 2
EN

Stack Overflow用户

发布于 2016-01-04 07:55:20

由于您在这个问题中没有提到您的awk命令,所以我认为您正在寻找一个使用awk的解决方案和一个解释。

代码语言:javascript
复制
AMD$ awk '!/^#/{printf $1": "$2" "}/end/{print '\n'}' File

Host: cow HostName: 172.18.0.10 User: root Port: 22
Host: dns2 HostName: 172.20.4.80 User: root Port: 22
Host: dns1 HostName: 172.20.4.75 User: root Port: 22
Host: dns3 HostName: 172.20.4.76 User: root Port: 22
Host: dns4 HostName: 172.20.4.77 User: root Port: 22
Host: dns5 HostName: 172.20.4.78 User: root Port: 22
Host: dns6 HostName: 172.20.4.79 User: root Port: 22

对于以NOT ( #!/^#/)开头的所有行,打印由:space分隔的1st2nd字段。继续这样做,直到我们到达end模式(/end/),在那里我们将打印新的行。

如果您正在寻找您已经拥有的awk命令的解释,请在问题中提及它。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34586643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档