선택적으로 grep

선택적으로 grep

bash에서 사용하는 1000개 이상의 지정자 파일이 있습니다.

for desig in $(desfile)
do
  grep $desig in listfile
done

목록 파일은 100만 개 이상의 라인마다 가능하므로 속도가 중요합니다.

문제는 다음과 같은 지정자에 대한 것입니다.

PA0EHH
DL/PA0EHH

그건 PA0EHH두 번이나 발견됐어

나는 awk가 더 선택적일 수 있지만 고통스러울 정도로 느리다는 것을 발견했습니다.

답변1

grep -xF -f desfile listfile

또는 desfile명령인 경우

grep -xF -f <(desfile) listfile

또는,

desfile | grep -xF -f /dev/stdin listfile

여기서 사용되는 옵션은

  • -x, a 라인의 전체 길이에 걸쳐 일치가 필요합니다. 이것은 줄의 하위 문자열을 일치시키지 않는 데 사용하려는 것입니다.
  • -F, 정규식 일치 대신 문자열 비교를 사용합니다. 이는 쿼리 속도를 높이고 패턴에 정규식에서 특수한 문자가 포함된 경우(특별해지기를 원하지 않는 경우) 필요합니다.
  • -f filename, 명령줄의 문자열이 아닌 파일에서 패턴을 읽습니다. 이는 적당한 양의 패턴에 적용됩니다. 당신이 많은 경우많은패턴을 사용하면 메모리가 부족할 수 있습니다. 이 경우 이를 사용하여 여러 개의 작은 파일로 분할(또는 명령인 경우 desfile출력 ) 한 다음 반복할 수 있습니다. 어쨌든 당신은desfilesplit~ 아니다grep각 패턴마다 한 번씩 호출하고 싶습니다 !

답변2

지정자가 각 행의 시작 부분인지 확인하는 경우

grep ^$desig listfile

첫 번째 적중으로 제한하려면 스위치를 추가하십시오 -m 1.
좀 더 세분화된 검색이 필요한 경우 정규식을 사용해 보세요.

testval=2
seq 40 | grep -e ^$testval\\b
seq 40 | grep -e \\b$testval\\b

사용 사례에 따라 둘 다 정확히 2와 일치합니다. 그리고 grep이 예를 들어 인식하지 못하도록 방지하려면2/2

echo "2/2 2" | grep -e [^\/]\\b$testval\\b

내 bash의 색상은 외로운 2뿐입니다.

답변3

성능이 중요하므로 여러 사례 ripgrep보다 벤치마크 속도가 더 빠른 를 사용하는 것을 고려하십시오.grep

관련 정보