如何在bash的第二列中删除没有任何内容的行?

时间:2013-09-23 10:21:01

标签: bash curl

这是curl -s ifconfig.me/all | column -t的示例输出:

ip_addr:      193.136.19.55
remote_host:  gwec.di.uminho.pt
user_agent:   curl/7.22.0        (x86_64-pc-linux-gnu)  libcurl/7.22.0  OpenSSL/1.0.1  zlib/1.2.3.4  libidn/1.23  librtmp/2.3
port:         37429
lang:
connection:
keep_alive:
encoding:
mime:         */*
charset:
via:
forwarded:

我喜欢以 user_agent 字段没有获取标签的方式解析它,并删除所有没有结果的字段。

ip_addr:      193.136.19.55
remote_host:  gwec.di.uminho.pt
user_agent:   curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
port:         37429
mime:         */*

2 个答案:

答案 0 :(得分:3)

使用awk,您可以使用awk '$2',这将检查第二个字段是否存在。如果确实存在,则会打印该行。

在你的情况下,

curl -s ifconfig.me/all | column -t | awk '$2'

实施例

$ awk '$2' your_result
ip_addr:      193.136.19.55
remote_host:  gwec.di.uminho.pt
user_agent:   curl/7.22.0        (x86_64-pc-linux-gnu)  libcurl/7.22.0  OpenSSL/1.0.1  zlib/1.2.3.4  libidn/1.23  librtmp/2.3
port:         37429
mime:         */*

  

我喜欢以user_agent字段不这样的方式解析它   获取标签,并删除没有结果的所有字段。

使用输入字段分隔符(FS = tab)和输出字段分隔符(OFS = space),如下所示:

$ awk 'BEGIN{FS="\t";OFS=" "} $2 {printf "%s\t",$1; for (i=2; i<=NF; i++) printf $i ; printf "\n"}' your_result
ip_addr:        193.136.19.55
remote_host:    gwec.di.uminho.pt
user_agent:     curl/7.22.0(x86_64-pc-linux-gnu)libcurl/7.22.0OpenSSL/1.0.1zlib/1.2.3.4libidn/1.23librtmp/2.3
port:   37429
mime:   */*

答案 1 :(得分:1)

awk 'BEGIN{OFS=" "}NF>1{t=$1;$1="";printf "%-13s%s\n",t,$0}'

使用样本输入输出:

ip_addr:      193.136.19.55
remote_host:  gwec.di.uminho.pt
user_agent:   curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
port:         37429
mime:         */*