한 단어를 먼저 찾은 다음 다른 단어를 찾으세요.

한 단어를 먼저 찾은 다음 다른 단어를 찾으세요.

값이 포함된 테이블을 찾고 싶습니다. 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.

따라서 파일에서 haystackEvery 전후의 세 줄을 검색하려면 다음을 수행합니다 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 = 구분 기호입니다.

관련 정보