SED - 从缓冲区空间获取第二行

时间:2015-02-10 18:24:10

标签: sed

我有一个配置文件有两行如下:

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'有效,但我怀疑有更优雅的东西。

5 个答案:

答案 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
  • 选择行并打印第二行(最后一行)。
  • 假设有(并且只有)2 https,如您的请求指定

<强>释

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