我想找到包含一个值的表。我看到一些使用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
。
因此,要在文件中搜索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'}
将打印结果中的第一个字段,其中字段是第一个空格之前的任何内容。
与 cut 类似:
tr , '\n' < database.sql | grep -ne -A3 -B3 'str' | cut -f1 -d" "
只是这一次 -d 将字段之间的分隔符指定为空格。它可以是任何你想要的东西,但只能是一个字符。所以 -f = 字段,-d = 分隔符。