Linux 命令行界面 : Extract variable number of lines from text file based on search

标签 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 提取行,但找到结束行号是棘手的部分。

我需要在 $START 行号之后找到第一次出现 UNLOCK TABLES; 的行号,但我不知道该怎么做。

有关更多详细信息,这是我想要提取的一段文本的示例:

--
-- 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;

提前致谢。

最佳答案

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

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

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

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

关于Linux 命令行界面 : Extract variable number of lines from text file based on search,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12100523/

相关文章:

linux - Shell脚本通配符扩展问题

json - 使用 json 数组 curl

linux - 重命名多个文件?

linux - 使用 JDBC/ODBC 驱动程序将 R 与数据库连接时保护用户凭据

bash - Zsh 中的哪个快捷方式与 Bash 中的 Ctrl-U 相同?

linux - Bash - 需要使用 exit 然后调用另一个函数?

java - 使用 X.509 公共(public)证书进行加密和解密

linux - 使用 Ansible 仅删除文件中第一次出现的行

java - 如何解决 groovy/grails 工具套件引用?

c++ - 将字节数组转换为 time_t