Linux CLI:根据搜索从文本文件中提取可变数量的行

时间:2012-08-23 21:52:30

标签: linux bash shell command-line-interface

我认为这是一个简单的问题。我有一个占用几GB的mysqldump文件,我想创建一个脚本,它只提取与一个表有关的文本行(传递给脚本的变量)并将它们保存到新文件中。

我要提取的部分始终以:

开头
-- Table structure for table `myTable`

始终以:

结束
UNLOCK TABLES;

表名和我想要的行数是可变的。我能够找到该部分的开头:

START=$(grep -n "Table structure for table \`$2\`" "$1" | awk -F ":" '{print $1}')

其中$1是要搜索的文件,$2是表名。这很好用,但后来我被卡住了。我知道一旦我有结束行号,我就可以用sed提取行,但找到结束行号是一个棘手的部分。

我需要在UNLOCK TABLES;行号后找到第一次出现$START的行号,而我却失去了如何做到这一点。

有关更多详细信息,请参阅以下文本的一部分示例:

--
-- Table structure for table `myTable`
--

DROP TABLE IF EXISTS `myTable`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `myTable` (
  `column1` varchar(12) NOT NULL,
  `column2` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`column1`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `myTable`
--

LOCK TABLES `myTable` WRITE;
/*!40000 ALTER TABLE `myTable` DISABLE KEYS */;
INSERT INTO `myTable` VALUES ('test11', 'test12'),('test21', 'test22');
/*!40000 ALTER TABLE `myTable` ENABLE KEYS */;
UNLOCK TABLES;

提前致谢。

1 个答案:

答案 0 :(得分:3)

使用sed;你不需要担心明确的行号;您可以使用正则表达式为第一行和最后一行选择范围。

firstLine="-- Table structure for table \`$2\`"
secondLine="UNLOCK TABLES;"

sed -n "/$firstLine/,/$secondLine/p" "$1"

-n限制sed仅打印与所需范围匹配的那些行。