Bash의 목록에서 파이프된 grep 명령 여러 개 실행

Bash의 목록에서 파이프된 grep 명령 여러 개 실행

보안 작업의 일환으로 저는 sqlite3을 사용하여 매일 SSH를 통해 수십 개의 Google Chrome 기록 파일을 분석합니다.

각 사용자는 수십 개의 승인된 "안전한" 사이트로 이동할 수 있습니다. 내 목적을 위해 나는 이러한 보안 사이트에 관심이 없습니다. 각 기록 파일의 URL을 나열하고 보안 웹사이트를 무시하기 위해 grep -v다음과 같이 각 보안 웹사이트를 사용하고 나열합니다.

sqlite3 /home/me/HistoryDatabaseFile.db "select * from urls order by url;" | grep -v safesite1.com | grep -v safesite2.com | grep -v safesite3.com | grep -v safesite4.com

등. 내 명령은 최소 20줄로 늘어났고 관리할 수 없게 되었습니다. 안전한 사이트를 목록 형식으로 제외하면서 사용자에게 URL 목록을 표시할 수 있는 방법이 있나요? 나는 다음과 같은 것을 상상하고 있습니다 :

safesite1.com
safesite2.com
safesite3.com

그런 다음 해당 목록을 명령으로 가져옵니다. 내부일 수도 있고 외부일 수도 있습니다. bash에서 출력되기만 하면 상관없습니다.

도와주셔서 감사합니다!

답변1

내 생각에 당신이 찾고있는 것은 다음과 같습니다

grep -vf safe_websites inputfile

-v이미 알고 있는 일치 항목을 되돌리려면 -f파일에서 패턴을 가져오는 것입니다 safe_websites.

답변2

고려할 수 있는 또 다른 옵션은 egrep확장 정규식을 사용하여 여러 대상을 단일 문자열에 넣을 수 있는 grep 형식을 사용하는 것입니다.

egrep -v "safesite1\.com|safesite2\.com|safesite3\.com"

이러한 RE와 기타 확장 RE에 대한 자세한 내용은 에서 확인할 수 있습니다 man 7 re_format.

답변3

앞서 언급했듯이 옵션을 사용 -f하고 사용할 모드 목록을 제공 해야 합니다 grep.grep

하지만 URL에 특수 문자가 포함되어 있다고 말씀하셨는데, 이는 말이 됩니다. 정답은 -F플래그를 사용하여 grep패턴을 고정 문자열로만 처리하는 것입니다.

따라서 원하는 것을 달성하려면 다음을 수행하십시오.

먼저 안전한 사이트 목록을 파일에 넣으세요 /tmp/safelist.txt. 예를 들면 다음과 같습니다.

safesite1.com
safesite2.com
safesite3.com

다음으로 grep다음과 같이 파일을 호출합니다.

sqlite3 /home/me/HistoryDatabaseFile.db "select * from urls order by url;" | grep -vFf /tmp/safelist.txt

답변4

내 문제는 내가 구문 분석하려는 데이터와 관련이 있는 것으로 나타났습니다. 다음을 사용하여 출력을 테스트하려고 하면

a
b
c
d
e

그런 다음 이를 사용하여 grep -vf file.txta, b 및 c를 삭제하면 매력처럼 작동합니다. 다양한 특수 문자가 포함된 여러 웹사이트를 무시하려고 하기 때문에 SQL 쿼리의 출력 .txt 파일을 조작하려고 할 때에도 작동하지 않습니다.

궁극적으로 명령을 더 읽기 쉽게 만드는 해결책은 백슬래시( \)를 사용하여 명령을 여러 줄로 분할하여 읽기 쉽게 만드는 것이었습니다.

sqlite3 /home/me/HistoryDatabaseFile.db "select * from urls order by url;" | \
grep -v safesite1.com | \
grep -v safesite2.com | \
grep -v safesite3.com | \
grep -v safesite4.com | \
grep -v safesite5.com

도움을 주셔서 감사합니다!

관련 정보