xargs를 사용하여 여러 명령의 결합된 출력을 한 번에 처리할 수 있는 방법이 있습니까?

xargs를 사용하여 여러 명령의 결합된 출력을 한 번에 처리할 수 있는 방법이 있습니까?

여러 개의 셸 명령이 있고 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.txtx

교차곱은 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*파일이 다음에서 가져온 경우 split9장도 읽어야 합니다.

parallel -a bigfile --block 10M --pipepart --argsep ,, -I ,, parallel --pipe --tee wc {} ::: -l -c -w

).

관련 정보