#!/usr/bin/env bash
URL_1=http://www.squid-cache.org/Versions/
URL_2=$(curl "$URL_1" | sed -n '/Stable Versions/{p; :loop n; p; /rolling/Iq; b loop}' | grep -i rolling | cut -d \" -f 2)
URL_3=$(curl "$URL_1""$URL_2" | sed -n '/Latest/{p; :loop n; p; /.gz/q; b loop}' | grep .gz | cut -d \" -f 2)
wget "$URL_1""$URL_2""$URL_3"
위의 코드를 한 줄로 줄일 수 있는 방법이 있나요?
단지 물건을 다운로드하기 위해 너무 많은 변수를 정의하는 것은 좋지 않습니다.
답변1
안감 1개, 주문방법 :)
URL_1
가독성을 높이기 위해 변수를 사용합니다. 필요 없음.
#!/bin/bash
URL_1=http://www.squid-cache.org/Versions/
curl "$URL_1" |
grep -Pzo '(?s)Stable Versions.*?langpack' |
sed -rn '$,$s_.*"(.*)">.*<td>(.*)</td></tr>.*_\1squid-\2.tar.gz_p' |
xargs -I{} wget "${URL_1}"{}
grep -Pzo '(?s)Stable Versions.*?langpack'
-P
패턴을 Perl 호환 정규식으로 해석합니다.-z
여러 줄 검색에 필요한 옵션입니다.-o
일치하는 줄에서 일치하는(비어 있지 않은) 부분만 인쇄합니다.(?s)
나머지 정규식에서는 "Dot Match Newline"을 활성화합니다. 정보:인라인 수정자..*?
욕심없는 매칭.
sed -rn '$,$s_.*"(.*)">.*<td>(.*)</td></tr>.*_\1squid-\2.tar.gz_p'
- 이 부분을 여기에서 만드세요:
v3/3.5/squid-3.5.26.tar.gz
$,$
마지막 행만 처리됩니다.- 슬래시 와 태그가 있기
s
때문에 ubstitute 명령에서 슬래시 대신 밑줄을 사용하고 있습니다 . 예: 대신에</tr>
</td>
s_foo_bar_
s/foo/bar/
- 이 부분을 여기에서 만드세요:
xargs -I{} wget "${URL_1}"{}
wget
Passxargs
:http://www.squid-cache.org/Versions/
연결된 두 부분을 에 전달합니다v3/3.5/squid-3.5.26.tar.gz
.
편집 - xargs가 없는 버전(여기에서는 필요하지 않음):
#!/bin/bash
URL_1=http://www.squid-cache.org/Versions/
wget "${URL_1}$(curl "$URL_1" |
grep -Pzo '(?s)Stable Versions.*?langpack' |
sed -rn '$,$s_.*"(.*)">.*<td>(.*)</td></tr>.*_\1squid-\2.tar.gz_p')"
답변2
단일 라이너의 경우 lynx
han 을 사용하십시오 curl
.
$ lynx -dump -listonly -nonumbers \
"$(lynx -dump -listonly -nonumbers http://www.squid-cache.org/Versions/ |
awk '/^http:.*\/Versions\/v/ {print ; exit}')" |
awk '/^http:.*\.tar.gz/ {print; exit}'
http://www.squid-cache.org/Versions/v3/3.5/squid-3.5.26.tar.gz
실제로 오징어 소스 코드의 최신 안정 버전을 다운로드하려면 전체를 래핑하십시오.wget "$(....)"