여러 개의 셸 명령이 있고 xargs
함께 처리될 수 있도록 동일한 인스턴스로 파이프하고 싶습니다.
파일과 전역 표현식이라는 두 가지 입력이 있습니다.
$ cat subdomains.txt
admin.site.com
web.site.com
api.site.com
$ ls -d x*
xab xac xad
나는 이것을 다음과 같이 만들고 싶다 :
admin.site.com:xab
admin.site.com:xac
admin.site.com:xad
web.site.com:xab
web.site.com:xac
web.site.com:xad
api.site.com:xab
api.site.com:xac
api.site.com:xad
내가 시도한 명령은 다음과 같습니다(작동하지 않음).
cat subdomains.txt | ls -d x* | xargs -I value1,value2 echo 'value1:value2'
답변1
GNU를 사용하여 이 작업을 수행할 수 있습니다 parallel
.
$ printf '%s\n' x* | parallel echo "{1}:{2}" :::: subdomains.txt :::: -
admin.site.com:xab
admin.site.com:xac
admin.site.com:xad
web.site.com:xab
web.site.com:xac
web.site.com:xad
api.site.com:xab
api.site.com:xac
api.site.com:xad
답변2
추악한 접근 방식이 필요합니다. eval
중괄호 확장은 일반적으로 변수 확장 전에 발생하기 때문에 두 번의 평가가 필요합니다.
sub=$( paste -sd, subdomains.txt )
xs=$( ls -d x* | paste -sd, )
eval "printf '%s\n' {$sub}:{$xs}"
더 나은 방법: 각 개별 단계의 결과를 배열에 저장한 다음 중첩 루프를 사용하여 결합합니다.
mapfile -t sub < subdomains.txt
xs=( x* )
for s in "${sub[@]}"; do
for x in "${xs[@]}"; do
echo "$s:$x"
done
done
답변3
$ printf '%s\n' x* | join -t : -1 2 -2 2 -o 1.1,2.1 subdomains.txt -
admin.site.com:xaa
admin.site.com:xab
admin.site.com:xac
web.site.com:xaa
web.site.com:xab
web.site.com:xac
api.site.com:xaa
api.site.com:xab
api.site.com:xac
이것은 파일에 나열된 도메인과 현재 디렉토리의 문자로 시작하는 파일 이름 join
사이에 일종의 외적을 생성하는 데 사용됩니다.subdomains.txt
x
교차곱은 join
존재하지 않는 필드(열 2, -1 2
및 로 지정됨 ) -2 2
에 두 데이터 세트를 결합하도록 요청하여 생성됩니다 . 또한 입력 및 출력 필드 구분 기호를 :
with 로 지정 -t :
하고 각 파일에서 첫 번째 열을 가져오려면 명시적으로 사용을 요구합니다 -o 1.1,2.1
(그렇지 않으면 결과에서 빈 첫 번째 열을 얻게 됩니다).
답변4
printf '%s\n' x*
파일이 32,000개 이상인 경우에만 필요합니다.
그렇지 않으면 다음과 같이 작동합니다.
parallel mytool.sh --parm1 {1} --parm2 {2} :::: subdomains.txt ::: x*
1장+2장 읽기http://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.html(다운로드는 다음 사이트에서 가능합니다.https://doi.org/10.5281/zenodo.1146014). 당신의 명령줄은 당신을 좋아할 것입니다.
( x*
파일이 다음에서 가져온 경우 split
9장도 읽어야 합니다.
parallel -a bigfile --block 10M --pipepart --argsep ,, -I ,, parallel --pipe --tee wc {} ::: -l -c -w
).