我有一个配置文件有两行如下:
some data...
some data...
https://localhost:8443 # default config
https://abc.client.mycorp.com:8443
some more data....
我想打印第二个行。但是,由于FQDN是动态设置的,我从来不知道它会是什么,所以我可以(可能)设置一个更精确的正则表达式
当我运行以下 行时返回
sed -n 's/.*\(https.*[0-9]\).*/\1/p' my.conf
什么需要添加到sed命令,所以我只得到第二行?
sed '1d'
有效,但我怀疑有更优雅的东西。
答案 0 :(得分:2)
您可以尝试此awk
awk -F"https" 'NF>1{split($2,a," ");if (++b==2) print FS a[1]}' my.conf
https://abc.client.mycorp.com:8443
它找到https
的行,并仅打印其中的第二行。
cat file
Some line with data
url=https://localhost:8443 # default config
url=https://abc.client.mycorp.com:8443
Some more data
awk -F"https" 'NF>1{split($2,a," ");if (++b==2) print FS a[1]}' file
https://abc.client.mycorp.com:8443
答案 1 :(得分:1)
有数千种方法可以做到这一点。
正如我在评论中所示:
head -n+2 my.conf | tail -n+2
但是10秒后,发现sed也很好:
sed -n '2p' my.conf
我认为awk也能够做到这一点。原谅我,我不记得变量名。
答案 2 :(得分:1)
你的命令
sed -n 's/.*\(https.*[0-9]\).*/\1/p'
此命令匹配任何带有模式https后跟数字的行。因此,这意味着sed将使用此模式打印所有行,无论是第1,第2,第3等。 另一个解决方案优雅解决方案
sed '2!d' my.conf
这是说每当你读一行而不是第2行就删除它。因此,仅打印第2行。 然而,对实际文件没有任何更改。
编辑:使用awk的解决方案
awk 'NR==2' my.conf
答案 3 :(得分:1)
只需从文件中打印第二行即可:
awk 'NR==2' file
但假设您确实要打印与您在sed命令中指定的正则表达式匹配的第二个字符串:
awk 'match($0,/https.*[0-9]/) { if (++cnt == 2) print substr($0,RSTART,RLENGTH) }' file
答案 4 :(得分:1)
sed -n '/https.*[0-9]/h;${g;s/.*\(https.*[0-9]\).*/\1/p;}' my.conf
<强>释强>
'/https.*[0-9]/
的行并将其复制到保留缓冲区h
(不附加,用当前行替换内容)${ }
g
(以便检索最后存储的行)s/.*\(https.*[0-9]\).*/\1/
调整格式\1 -> \( \)
并打印修改后的内容p