ある単語を最初に見つけてから別の単語を見つけます。

ある単語を最初に見つけてから別の単語を見つけます。

値を含むテーブルを探したいです。私は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

したがって、ファイル内のhaystackEveryの前後の3行を検索するには、次の手順を実行しますneedle

$ grep -C3 'needle' /path/to/haystack

またはあなたの場合、針はロープなので、次のようになりますtable

$ grep -C3 'table' /path/to/haystack

ただし、table小文字が常に大文字と小文字であるかどうかわからない場合(mysqldumpキーワードは通常大文字で表示されます)、大文字と小文字を区別せずに検索することをお勧めします。

$ grep -i -C3 'table' /path/to/haystack

おすすめ記事