값이 포함된 테이블을 찾고 싶습니다. mysql을 사용하는 몇 가지 솔루션을 보았지만 Linux에서 이를 어떻게 수행할 수 있을까?라는 생각이 들기 시작했습니다. , 전혀 모르겠지만 알고 싶습니다. 따라서 단계는 다음과 같습니다. - 파일에서 단어 찾기(mysqldump) - 조회 테이블 이름 반환("table"이라는 단어가 어느 정도 포함된 행)
grep이 단어를 찾으면 큰 줄을 반환하므로 어떻게든 잘라내야 하기 때문에 추가적인 문제가 있습니다.
내 가장 가까운 근사치:
tr , '\n' < database.sql | grep -ne 'str'
그런 다음 이전 행을 가져오는 것과 같은 작업을 수행할 수 있지만 head
"테이블"을 찾을 때까지 재귀적으로 수행한 다음 행 + 3행을 위아래로 이동하는 방법을 모르겠습니다.
내 질문을 명확히하기 위해. 파일에는 다음 내용이 포함되어 있습니다.
[....]
(line 234) "INSERT INTO table_name ...."
[...]
(line 400) ... str ...
[...]
다음과 같아야 합니다. 줄 번호를 찾으려면 tr , '\n' < database.sql
긴 줄을 잘라야 합니다
grep -ne 'str'
. 예에서는 400입니다. 그러면 해당 줄에서 시작하여 파일에서 다른 단어를 찾아야 합니다.
tac [start in line 400] | grep -m 1 "INSERT INTO"
모두 연속으로
업데이트 좋은 근사치가 있습니다.
var=$(tr , '\n' < database.sql | grep -m 1 -ne 'str' | cut -f1 -d:) ; head -n$var log.log | grep -m1 -C2 'INSERT INTO'
나는 라인 x에서 시작하여 str이 발견될 때까지 올라가는 것을 선호하지만 작동합니다.
답변1
실제 질문만 고려하세요.
[방법] "테이블"을 찾을 때까지 반복한 다음 위아래로 +3 행 뒤로 이동합니다.
이는 세 가지 옵션이 있는 with 에 도움이 됩니다 grep
(그 중 하나는 다른 두 가지 옵션을 의미합니다:
-Ax
(또는 "이후") 표시엑스패턴 일치 뒤의 줄(예-A3
: )입니다.-Bx
(또는 "이전") 표시엑스패턴은 이전 줄과 일치합니다(예-B3
: ).-Cx
(또는 "컨텍스트") 표시엑스이전 줄그리고패턴 일치 후(예-C3
: )-Cx
와 동일합니다-Ax -Bx
.
따라서 파일에서 haystack
Every 전후의 세 줄을 검색하려면 다음을 수행합니다 needle
.
$ grep -C3 'needle' /path/to/haystack
또는 귀하의 경우 바늘이 로프이므로 다음과 같습니다 table
.
$ grep -C3 'table' /path/to/haystack
그러나 table
소문자가 항상 대소문자인지 모르는 경우( mysqldump
키워드는 일반적으로 대문자로 표시됨) 대소문자를 구분하지 않고 검색하는 것이 좋습니다.
$ grep -i -C3 'table' /path/to/haystack
답변2
최선의 답변이 없으면 근사치를 사용하겠습니다.
var=$(tr , '\n' < database.sql | grep -m 1 -ne 'str' | cut -f1 -d:) ; head -n$var log.log | grep -m 1 'INSERT INTO'
나는 x 줄에서 시작하여 str을 찾을 때까지 올라가는 코드를 선호하지만 작동합니다.
답변3
Grep에는 -A(이후)와 -B(이전)라는 두 가지 멋진 옵션이 있으므로 다음과 같습니다.
tr , '\n' < database.sql | grep -ne -A3 -B3 'str'
검색한 문자열이 포함된 행과 그 위의 세 행, 아래의 세 행을 반환합니다.
질문 전체에 답변하고 싶지만, 귀하께서 원하시는 것이 무엇인지 잘 이해하지 못하는 것 같습니다.
문자열을 자르려면 명령 cut
및/또는awk
AWK는 더 복잡하지만 사용이 간단합니다.awk {'print $1'}
그래서:
tr , '\n' < database.sql | grep -ne -A3 -B3 'str' | awk {'print $1'}
결과의 첫 번째 필드를 인쇄합니다. 여기서 field는 첫 번째 공백 앞에 오는 모든 것입니다.
컷과 유사:
tr , '\n' < database.sql | grep -ne -A3 -B3 'str' | cut -f1 -d" "
이번에는 -d가 필드 사이의 구분 기호를 공백으로 지정합니다. 원하는 것은 무엇이든 가능하지만 문자는 하나만 가능합니다. 따라서 -f = 필드, -d = 구분 기호입니다.