我想读取一个文件,并使用using脚本将其打印到stdout。在python中,rsplit可以完成这项工作,但我搜索并找到awk,但我无法理解。
file1:
#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在解析完它之后,
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在这件事上任何人都可以帮我谢谢
发布于 2016-01-04 07:57:51
基于文本(假设结构是完整的(开始->结束),没有空行,.)
awk -v "Sep=\t" '/^#begin/{Infos="";next}/^#end/{print Infos;next}{Infos = Infos ($1~/^Host$/ ? "" : Sep) $1 ": " $2}' YourFileSep是信息子序列之间的分隔符。
过滤器也是如此(如果过滤器是相同的,只打印;如果宿主是牛或男孩)
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`‘作为第一个单词。发布于 2016-01-04 07:55:20
由于您在这个问题中没有提到您的awk命令,所以我认为您正在寻找一个使用awk的解决方案和一个解释。
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分隔的1st和2nd字段。继续这样做,直到我们到达end模式(/end/),在那里我们将打印新的行。
如果您正在寻找您已经拥有的awk命令的解释,请在问题中提及它。
https://stackoverflow.com/questions/34586643
复制相似问题