선택적으로 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, 라인의 전체 길이에 걸쳐 일치해야 합니다. 이것은 줄의 하위 문자열을 일치시키지 않는 데 사용하려는 것입니다.
  • -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에는 Solitude 2 색상만 있습니다.

답변3

성능이 문제이기 때문에 많은 경우 ripgrep보다 벤치마킹하는 것이 더 빠르다고 간주됩니다 .grep

관련 정보