SED - 从缓冲区 space 获取第二行

SED - get second line from buffer space

我有一个包含两行的配置文件:

some data...
some data...
https://localhost:8443 # default config
https://abc.client.mycorp.com:8443
some more data....

我想打印第 second 行。但是,由于 FQDN 是动态设置的,所以我事先不知道它会是什么,所以我可以(可能)设置更精确的正则表达式

当我运行返回以下行时

sed -n 's/.*\(https.*[0-9]\).*//p' my.conf

sed 命令需要添加什么才能只得到第二行? sed '1d' 有效,但我怀疑还有更优雅的东西。

有成千上万种方法可以做到这一点。

如我在评论中所示:

head -n+2 my.conf | tail -n+2

但 10 秒后,发现 sed 也很好:

sed -n '2p' my.conf

我认为 awk 也可以做到这一点。请原谅我不记得变量名了。

你可以试试这个awk

awk -F"https" 'NF>1{split(,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(,a," ");if (++b==2) print FS a[1]}' file
https://abc.client.mycorp.com:8443

你的命令

sed -n 's/.*\(https.*[0-9]\).*//p'

此命令匹配任何具有模式 https 后跟 digit.It 的行,因此意味着 sed 将使用此模式打印所有行,无论是第一行、第二行、第三行等。 另一个解决方案是

sed '2!d' my.conf

这是说每当你读到一行而不是第 2 行时删除它。因此只打印第 2 行。 然而,没有对实际文件进行任何更改。

编辑: 使用 awk 的解决方案

awk 'NR==2' my.conf

只打印文件的第二行是:

awk 'NR==2' file

但假设您确实想要打印与您在 sed 命令中指定的正则表达式相匹配的第二个字符串:

awk 'match([=11=],/https.*[0-9]/) { if (++cnt == 2) print substr([=11=],RSTART,RLENGTH) }' file
sed -n '/https.*[0-9]/h;${g;s/.*\(https.*[0-9]\).*//p;}' my.conf
  • select行并打印第二行(最后一行)。
  • 假设有(并且只有)2 个 https 像您的请求指定的那样

说明

  • select 带有模式 '/https.*[0-9]/ 的行并将其复制到保存缓冲区 h(不追加,用当前行替换内容)
  • 最后${ }
  • 将保存缓冲区获取到工作缓冲区g(因此检索最后存储的行)
  • 使用组引用 -> \( \) 调整格式 s/.*\(https.*[0-9]\).*// 并打印修改后的内容 p