특정 정보를 구문 분석하는 데 일반적으로 사용하는 몇 가지 grep 필터가 있습니다.
첫 번째 grep: grep "pattern1\|pattern2\|pattern3\|" file.txt
두 번째 grep:grep "patternA\|patternB\|patternC\|" file.txt
등.
file.txt
나는 일반적으로 독립적인 출력을 얻기 위해 동일한 콘텐츠에 각 grep을 적용합니다 .
각 grep 유형에 대해 별도의 출력을 얻을 수 있도록 이 grep 묶음을 bash 스크립트로 그룹화하는 방법을 알고 싶습니다.
예를 들어 file.txt
다음을 입력합니다.
This line1 is the first line in here1
This line2 is the second line in here2
This line3 is the third line in here3
This line4 is the fourth line in here4
나는 일반적으로 특정 패턴을 얻기 위해 여기에 별도의 grep을 적용합니다.
grep -h -r --color=always "line1\|here1" file.txt >>pattern1.txt
또는
grep -h -r --color=always "line2\|here2" file.txt >>pattern2.txt
이렇게 하면 필요한 정보만 강조 표시되고 pattern*.txt
작업할 별도의 파일이 제공됩니다. 여기서 목표는 이러한 모든 grep을 한 번에 실행하여 동일한 파일을 평가하고 다음과 같이 셸에서 인쇄하는 것입니다.
Pattern1
Pattern2
Pattern3
등.
각 grep은 전체 파일을 독립적으로 평가해야 합니다.
답변1
grep
질문을 올바르게 이해한다면 동일한 옵션과 동일한 입력을 사용하여 동일한 command()를 여러 번 실행하지만 정규식 매개 변수와 출력은 다르게 실행하는 방법에 관한 것입니다 . 불필요한 중복/중복을 피하고 싶은 것 같습니다.
정규식 배열(검색 문자열)을 원하는 것 같습니다.
declare -A regex
regex[1]="line1\|here1"
regex[2]="line2\|here2"
regex[3]="line3\|here3"
regex[4]="line4\|here4"
for i in "${!regex[@]}"
do
grep -h -r --color=always "${regex["$i"]}" file.txt >> "pattern$i.txt"
done
첫 번째 줄( )은 다음과 같은 declare -A regex
연관 배열을 선언합니다. regex
이는 배열을 자리 표시자로 생성하지만 그 안에 정보(요소)를 넣지 않음을 의미합니다. 다음 네 줄은 숫자 1
, 2
및 로 색인 3
이 지정된 정규식인 4개 요소로 배열을 채웁니다 4
. (원하는 것 같아서 이 인덱스를 사용했지만 다른 문자열을 인덱스로 사용할 수 있습니다. 예를 들어 , uno
, dos
및 , 또는 tres
, , 및 . † ) 변수 가 인덱스 값을 반복하도록 하는 명령문 , , 그리고 . (생략 하고 말하면 요소 값 과 을 반복합니다 .) is가 로 감소하면 로 확장됩니다 . 따라서 루프는 4번 반복(실행)하여 원하는 4개의 명령을 실행합니다.cuatro
ant
bat
cat
dog
for
for i in "${!regex[@]}"
i
1
2
3
4
!
for i in "${regex[@]}"
line1\|here1
line2\|here2
line3\|here3
line4\|here4
$i
1
${regex["$i"]}
${regex[1]}
line1\|here1
grep
이러한 프로세스를 병렬로 실행하려면 grep
다음을 수행하십시오.
나는 "${!regex[@]}"에서 하다 grep -h -r --color=always "${regex["$i"]}" file.txt >> "pattern$i.txt"& 완벽한 기다리다
______________
† 인덱스가 숫자상으로 구별되는 음이 아닌 정수인 경우 이 declare
진술을 생략할 수 있습니다.