2012-08-23 34 views
1

我有我認爲是一個簡單的問題。我有一個佔用幾GB的mysqldump文件,並且我想創建一個腳本,該腳本將只提取與一個表(傳遞給腳本的變量)有關的文本的行,並將其保存到新文件中。Linux CLI:根據搜索從文本文件中提取可變數量的行

我想隨時提取該部分的開頭爲:

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

在此先感謝。

回答

3

使用sed;你不需要擔心明確的行號;您可以使用第一行和最後一行的正則表達式來選擇範圍。

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

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

-n限制sed到僅打印那些符合所希望的範圍的行。

+0

所以這會在'$ firstLine'後面找到'$ secondLine'的第一次出現? –

+0

是的,它應該。 – chepner

+0

是的工作。謝謝! –

相關問題