先找到一个词再找到另一个词

先找到一个词再找到另一个词

我想找到包含一个值的表。我看到一些使用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

仅考虑提出的实际问题:

[如何]递归直到找到“table”,然后向上和向下返回+3行。

这对 with 很有帮助grep,它具有三个选项(其中之一意味着其他两个选项:

  • -Ax(或“之后”)显示X模式匹配后的行(例如-A3)。
  • -Bx(或“之前”)显示X模式匹配之前的行(例如-B3)。
  • -Cx(或“上下文”)显示X之前的行在模式匹配之后(例如-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'}将打印结果中的第一个字段,其中字段是第一个空格之前的任何内容。

与 cut 类似:

tr , '\n' < database.sql | grep -ne -A3 -B3 'str' | cut -f1 -d" "

只是这一次 -d 将字段之间的分隔符指定为空格。它可以是任何你想要的东西,但只能是一个字符。所以 -f = 字段,-d = 分隔符。

相关内容