仅保留curl中特定字符串和扩展名的链接

时间:2018-01-12 03:55:23

标签: curl awk grep

我尝试使用此命令获取网页上的所有链接:

curl https://www.theiphonewiki.com/wiki/Firmware/iPhone/11.x 2>&1 | grep -o -E 'href="([^"#]+)"' | cut -d'"' -f2

以上命令的示例输出:

/w/index.php?title=1.62.00&action=edit&redlink=1
/w/index.php?title=1.03.06&action=edit&redlink=1
http://appldnld.apple.com/ios11.2/091-50808-20171204-1847CB08-D51D-11E7-881F-9E4D7B7A613A/iPhone10,6_11.2_15C113_Restore.ipsw
/w/index.php?title=Cinar_15C114_(iPhone10,3)&action=edit&redlink=1
/w/index.php?title=Cinar_15C114_(iPhone10,6)&action=edit&redlink=1
http://appldnld.apple.com/ios11.2/091-51760-20171206-BA09FB16-D5F7-11E7-A344-36B9DC24E03F/iPhone10,6_11.2_15C114_Restore.ipsw
http://appldnld.apple.com/ios11.2/091-48448-20171204-6BBD49C4-BB37-457E-B21F-D3758FAFC4BC/iPhoneiTunesUpdateReadMe.ipd
/w/index.php?title=Cinar_15C153_(iPhone10,3)&action=edit&redlink=1
/w/index.php?title=Cinar_15C153_(iPhone10,6)&action=edit&redlink=1
http://appldnld.apple.com/ios11.2.1/091-54847-20171213-5FBB02FC-DDFB-11E7-9CEF-07E4FB2783B2/iPhone10,6_11.2.1_15C153_Restore.ipsw
http://appldnld.apple.com/ios11.2.1/091-56152-20171213-AC5CB9A6-DF73-11E7-99DE-5B0F1E4B8CED/iPhoneiTunesUpdateReadMe.ipd
/w/index.php?title=Cinar_15C202_(iPhone10,3)&action=edit&redlink=1
/w/index.php?title=Cinar_15C202_(iPhone10,6)&action=edit&redlink=1
http://appldnld.apple.com/ios11.2.2/091-58675-20170108-B84E4534-F0C8-11E7-B3D8-7C2D869EB6BD/iPhone10,6_11.2.2_15C202_Restore.ipsw
http://appldnld.apple.com/ios11.2.2/091-58073-20180108-92DAC272-EFDE-11E7-83F1-982A165C2DF1/iPhoneiTunesUpdateReadMe.ipd

从这里开始,我只希望链接包含单词iPhone10,6,并以扩展名.ipsw结尾。任何帮助如何从该命令行继续?

预期输出为:

http://appldnld.apple.com/ios11.2/091-50808-20171204-1847CB08-D51D-11E7-881F-9E4D7B7A613A/iPhone10,6_11.2_15C113_Restore.ipsw
http://appldnld.apple.com/ios11.2/091-51760-20171206-BA09FB16-D5F7-11E7-A344-36B9DC24E03F/iPhone10,6_11.2_15C114_Restore.ipsw
http://appldnld.apple.com/ios11.2.1/091-54847-20171213-5FBB02FC-DDFB-11E7-9CEF-07E4FB2783B2/iPhone10,6_11.2.1_15C153_Restore.ipsw
http://appldnld.apple.com/ios11.2.2/091-58675-20170108-B84E4534-F0C8-11E7-B3D8-7C2D869EB6BD/iPhone10,6_11.2.2_15C202_Restore.ipsw

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用一个简单的grep简化cutawk群,但它不在问题的上下文中。但是,根据您的要求,只需将输出管道传输到AWK

| awk '/(iPhone10,6)/ && /.ipsw$/'

定义了两个正则表达式条件,以匹配(iPhone10,6)并以.ipsw扩展名结束。

正如承诺在awk本身做的那样,我们可以使用GNU gensub()中的awk函数来捕获带有href的字符串,一旦URL为如果匹配使用match()函数

所需的字符串,则将其打印出来
curl ... | awk '{url=gensub(/^(.*)href="([^"#]+)"(.*)$/,"\\2","g",$0); if (match(url, /iPhone10,6.*\.ipsw/)) print url}'

答案 1 :(得分:1)

如接受的答案中所述,您可以将grep - cut组合替换为awk。但也可以使用sed。以下是这个问题的解决方法:

<强>脚本

# curl https://www.theiphonewiki.com/wiki/Firmware/iPhone/11.x 2>&1 |
 sed -nE '/iPhone10,6.*\.ipsw/{s/^.*href="([^"#]+)".*$/\1/p}'

<强>输出

http://appldnld.apple.com/ios11.1seed/091-41194-20171023-8AEAD654-B5F2-11E7-8655-C76EBEA7E146/iPhone10,6_11.1_15B93_Restore.ipsw
http://appldnld.apple.com/ios11.1.1/091-42552-20171106-4525806E-C39A-11E7-B432-4BBCF8FD2868/iPhone10,6_11.1.1_15B150_Restore.ipsw
http://appldnld.apple.com/ios11.1.2/091-48137-20171116-4F9256F2-C9C7-11E7-8F92-8DE0F451CBCD/iPhone10,6_11.1.2_15B202_Restore.ipsw
http://appldnld.apple.com/ios11.2/091-50808-20171204-1847CB08-D51D-11E7-881F-9E4D7B7A613A/iPhone10,6_11.2_15C113_Restore.ipsw
http://appldnld.apple.com/ios11.2/091-51760-20171206-BA09FB16-D5F7-11E7-A344-36B9DC24E03F/iPhone10,6_11.2_15C114_Restore.ipsw
http://appldnld.apple.com/ios11.2.1/091-54847-20171213-5FBB02FC-DDFB-11E7-9CEF-07E4FB2783B2/iPhone10,6_11.2.1_15C153_Restore.ipsw
http://appldnld.apple.com/ios11.2.2/091-58675-20170108-B84E4534-F0C8-11E7-B3D8-7C2D869EB6BD/iPhone10,6_11.2.2_15C202_Restore.ipsw

注意 显着 比实际方法更快。