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
我有一个包含两行的配置文件:
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