我必须使用以下'grep'命令从LOGFILE.Its提取工作,但任何人都可以让我知道下面的'grep'命令是如何工作的。请详细解释。谢谢。请回复因为我需要了解它
INS=`grep "Insert completed" ${LOGFILE}.tmp | sed 's/\(^.*Insert completed. \)\(.*\)\
(row.*$\)/\2/'`
答案 0 :(得分:1)
grep
命令没有做任何特别的事情。它只是查看通过该变量指定的日志文件,并输出包含字符串Insert completed
的所有行。
sed
命令正在执行您认为grep
正在做的事情。 sed
创建了两个捕获组(由\(..\)
表示)。它从开始到Insert completed.
抓取整个字符串并将其存储在捕获组1中。第二个捕获组将其余字符串存储到行中。第三个捕获组存储从row
到由$
表示的行尾。您可以通过捕获组2(由\2
表示)替换它。
因此,INS
变量保存sed's
替换的输出。
答案 1 :(得分:0)
让我们分一部分。
INS=
- 将命令的结果分配给shell变量INS
。grep
- 在文件中搜索字符串的命令。grep "Insert completed" ${LOGFILE}.tmp
- 在文件whatever-the-LOGFILE-variable-is.tmp
中搜索字符串“Insert completed”。| sed
- 获取grep
命令的结果(即文件中包含“已完成插入”的行)并将其发送到sed
,“流编辑器“。s/
- sed
是一个非常强大的命令,可以完成一百零五个事情。这开始了sed
的“搜索和替换”功能。与搜索和替换文字处理器不同,这更加强大,使用“正则表达式”来查找要搜索和替换的内容。基本上,我们定义了一个“模板”或“原型”或类似我们正在寻找的文本类型,而不仅仅是一个精确的子字符串。\(
- 在sed
正则表达式中开始“捕获组”。您可以在其他地方阅读其中的详细信息,但是为了您发布的命令的目的,这只是说“将子模式匹配到下一个\)
,并为其分配一个我以后可以使用的数字”。< / LI>
^
- 匹配行的开头。.*
- 匹配任意长度的字符串,但是该行的其余部分与正则表达式中的其他约束匹配。Insert completed
- 匹配确切的字符串“Insert completed”.
- 匹配任何一个单个字符。\)
- 结束捕获组从上面开始。\(
- 启动一个新的捕获组,第二个。.*
- 再次匹配任意长度的字符串。\)
- 结束第二个捕获组。\(
- 启动第三个捕获组。row.*
- 匹配字符串“row”后跟任何内容。$
- 匹配一行的结尾。\)
- 结束第三个捕获组。/
- 结束“搜索和替换”的“搜索”部分。接下来是“替换”。\2
- 这是指上面第二个捕获组的内容,即“Insert completed”之后和“row”之前的“any string”。/
- 结束“搜索和替换”的“替换”部分。因此,在日志文件中查找带有“Insert completed”的行,在“Insert completed”之后但在“row”之前找到它们的一部分,并将该行向下剪切到该部分。