1

単純な問題だと思ったことがあります。数GBを占めるmysqldumpファイルがあり、1つのテーブル(スクリプトに渡される変数)に関連するテキストの行だけを抽出して新しいファイルに保存するスクリプトを作成したいと思います。

抽出したいセクションは常に次のように始まります。

-- 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その方法がわかりません。

詳細については、抽出したいテキストの1つのセクションの例を次に示します。

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

前もって感謝します。

4

1 に答える 1

3

使用しsedます。明示的な行番号について心配する必要はありません。最初と最後の行の両方に正規表現を使用して範囲を選択するだけです。

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

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

目的の範囲に一致する行のみを印刷する-n制限。sed

于 2012-08-23T22:13:13.943 に答える