grep과 함께 find를 사용하고 결과를 다른 grep에 전달

grep과 함께 find를 사용하고 결과를 다른 grep에 전달

find를 사용하여 파일을 찾으려고 하는데 첫 번째 grep이 해당 파일에서 패턴을 찾습니다. 결과는 다음과 같이 두 번째 grep으로 전달됩니다.

find /Dime/Lock_Room/ -name CDRV.txt -type f -mtime -1 -exec fgrep "Audience" {} \; -exec fgrep "Prime_Time" {} \;

나는 점점

1584508620604,Audience,Lunchtime/14196_135
1584508620604,Audience,Early_afternoon/8824_188
1584508620604,Audience,Late_afternoon/20124_128
1584508620604,Audience,Prime_Time/45214_3514
1584508620604,Audience,Prime_Time/55096_4206
1584508620604,Audience,Graveyard/1800_256
1584508620604,Public,Prime_Time/148351_1251
1584508620604,Audience,Graveyard/1800_256
1584508620604,Public,Prime_Time/158521_19             

내가 찾고 있어요

1584508620604,Audience,Prime_Time/45214_3514
1584508620604,Audience,Prime_Time/55096_4206

추신: 파이프를 사용하지 않으려고 합니다 | 찾기와 함께

답변1

George Vasiliou에게 큰 감사를 드립니다. 두 답변 모두 잘 작동했습니다. 답변 2가 제가 선택한 것입니다.

답변 1

find /Dime/Lock_Room/ -name CDRV.txt -type f -mtime -1 -exec bash -c 'fgrep "Audience <(fgrep "Prime_Time" $0)' {} \;

답변 2

find /Dime/Lock_Room/ -name CDRV.txt -type f -mtime -1 -exec awk '/Audience/ && /Prime_Time/' {} \;

답변2

grep첫 번째 결과를 두 번째 결과로 공급해야 합니다 grep. 귀하의 질문에 있는 명령은 grep서로 독립적으로 호출을 수행합니다.

제안은 다음과 같습니다

find /Dime/Lock_Room/ -type f -mtime -1 -name CDRV.txt \
    -exec grep -F Audience {} \; | grep -F Prime_time

이렇게 하면 파일을 찾고 CDRV.txt(파일이 -type-mtime테스트를 통과한 경우) 하위 문자열이 포함된 모든 줄을 추출합니다 Audience. 이 결과는 grep하위 문자열도 포함하는 행을 추출하는 두 번째 결과로 전달됩니다 Prime_Time. 이 두 번째는 명령 grep과 독립적으로 실행됩니다 find.

분명히 문자열을 직접 사용할 수 있습니다 Audience,Prime_Time. grep또는 이 두 문자열의 순서가 확실하지 않은 경우 다음을 사용하십시오.awk 당신이 자신의 대답에서 제안한대로, 이는 좀 더 유연성을 제공합니다.

를 실행하는 일반 Linux 시스템에서는 bash다음 없이도 작업을 수행할 수 있습니다 find.

touch --date='now -1 day' timestamp
shopt -s globstar dotglob nullglob

for pathname in /Dime/Lock_Room/**/CDRV.txt; do
    if [[ ! -f $pathname ]] || [[ $pathname -ot timestamp ]]; then
        continue
    fi
    grep -F Audience "$pathname"
done | grep -F PrimeTime
rm -f timestamp

관련 정보