내가 사용하는 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
명령의 출력)을 여러 개의 작은 파일로 나눈 다음 해당 파일을 반복할 수 있습니다. 무슨 일이 있어도 당신은 그럴 것입니다desfile
split
아니요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