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

추신: find에 파이프를 사용하지 않으려고 했습니다.

답변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

관련 정보