unix shell脚本(grep命令)

时间:2014-03-11 05:20:24

标签: shell unix grep

我必须使用以下'grep'命令从LOGFILE.Its提取工作,但任何人都可以让我知道下面的'grep'命令是如何工作的。请详细解释。谢谢。请回复因为我需要了解它

INS=`grep "Insert completed" ${LOGFILE}.tmp | sed 's/\(^.*Insert completed. \)\(.*\)\   
(row.*$\)/\2/'`

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”之前找到它们的一部分,并将该行向下剪切到该部分。