보안 작업의 일환으로 저는 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.txt
a, 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
도움을 주셔서 감사합니다!