
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