値を含むテーブルを探したいです。私は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行後ろに移動します。
これは3つのオプションを持つwithに役立ちますgrep
(そのうちの1つは他の2つのオプションを意味します。
-Ax
(または「以降」)表示Xパターン一致の後の行(たとえば-A3
)。-Bx
(または「以前」)表示Xパターンは前の行と一致します(例-B3
:)。-Cx
(または「コンテキスト」)表示X前の行そしてパターンが一致した後(たとえば-C3
)-Cx
と同じです-Ax -Bx
。
したがって、ファイル内のhaystack
Everyの前後の3行を検索するには、次の手順を実行します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(以前)という2つの素晴らしいオプションがあります。
tr , '\n' < database.sql | grep -ne -A3 -B3 'str'
検索した文字列を含む行、その上の3行、下の3行を返します。
質問全体に答えたいのですが、あなたが望むものが何であるかをよく理解していないようです。
文字列を切り捨てるには、コマンドおよびcut
/またはawk
AWKはより複雑ですが、使いやすいです。awk {'print $1'}
だから:
tr , '\n' < database.sql | grep -ne -A3 -B3 'str' | awk {'print $1'}
結果の最初のフィールドを印刷します。ここで、フィールドは最初のスペースの前に来るすべてです。
カットに似ています:
tr , '\n' < database.sql | grep -ne -A3 -B3 'str' | cut -f1 -d" "
今回は、-dはフィールド間の区切り文字をスペースで指定します。欲しいものは何でも可能ですが、文字は1つだけです。したがって、-f = フィールド、-d = 区切り記号です。