연속으로 여러 컬을 해보세요

연속으로 여러 컬을 해보세요
#!/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}"{}
  1. grep -Pzo '(?s)Stable Versions.*?langpack'
    • -P패턴을 Perl 호환 정규식으로 해석합니다.
    • -z여러 줄 검색에 필요한 옵션입니다.
    • -o일치하는 줄에서 일치하는(비어 있지 않은) 부분만 인쇄합니다.
    • (?s)나머지 정규식에서는 "Dot Match Newline"을 활성화합니다. 정보:인라인 수정자.
    • .*?욕심없는 매칭.
  2. 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/
  3. xargs -I{} wget "${URL_1}"{}
    • wgetPass xargs: 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

단일 라이너의 경우 lynxhan 을 사용하십시오 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 "$(....)"

관련 정보