【问题标题】:Extract a table from a MySQL dump with tac, grep and sed...in reverse反向使用 tac、grep 和 sed...从 MySQL 转储中提取表
【发布时间】:2013-01-08 18:05:46
【问题描述】:

我关注this guide 使用 grep 从 mysql 转储中提取表,因此我不必恢复所有 50GB 的数据来查看一个表。拉表的两个主要命令是:

 grep -n "Table structure" [MySQL_dump_filename].sql

获取表定义的行号,然后

 sed -n '[starting_line_number],[ending_line_number] p' [MySQL_dump_filename].sql > [table_output_filename].sql

不过,我想以相反的顺序搜索 .sql 转储,因为我需要的是接近文件末尾的内容,并且需要很长时间才能 grep 前 48GB 的​​数据。我在 OS X 上并安装了 tac(通过 brew 指出 here)。但是是否可以设置命令来完成此操作并在 sed 获取所需的行后退出?如果不是,我还不如从一开始就 grep 而不是 tac,就等着吧。或者,当我看到文件填充在另一个终端中时,按 ctrl-c。

示例运行:

$ tac dump.sql | grep -n "Table structure"
...
751:-- Table structure for table `answer`
779:-- Table structure for table `template`
806:-- Table structure for table `resource`
...

当然,这些是相反的行号,所以如果你需要'模板'表,你需要 sed -n '752,779 p',但从文件末尾开始,否则你会得到错误的行编号(sed 将从文件开头开始计数)。

【问题讨论】:

  • grep 可以在几分钟内粉碎千兆字节的数据,尤其是较新的 GNU 版本。不过,为什么不使用 Ruby、Python 或 Perl 等脚本语言一次性完成呢?

标签: mysql sed grep


【解决方案1】:

一些快速提示:

  • dd 可以帮助您非常快跳过 N 个字节/块/如果您确定前 N gb 没用的话

  • 跳过后,无需 1) grep 查找行号 然后 2) sed 跳过到第 n 行(读取剩余的两倍):您可以直接:

    awk '/beginningpattern/,/endpattern/ { print $0 ; }' #warning:语法不完整,更好地了解 awk 及其威力。你可以做各种整洁的事情。

【讨论】:

    【解决方案2】:

    这是了解所有表定义从哪里开始和结束的更简化的方法。

    对于给定文件rolando.sql,创建一个执行以下操作的脚本:

    DAT=rolando.sql
    TBLMAP=tblmap.txt
    TBLLST=${TBLLST}.lst
    TBLTMP=${TBLMAP}.tmp
    RUNMAP=DisplayTables.sh
    grep -n "^-- Table structure" ${DAT} |sed 's/:/ /'| awk '{print $1}'  > ${TBLTMP}
    grep -n "^) ENGINE="          ${DAT} |sed 's/:/ /'| awk '{print $1}' >> ${TBLTMP}
    sort -n < ${TBLTMP} > ${TBLLST}
    rm -f ${TBLTMP}
    rm -f ${TBLMAP}
    POS=1
    for X in `cat ${TBLLST}`
    do
        (( POS = 1 - POS ))
        if [ ${POS} -eq 0 ]
        then
            (( Y = X - 2 ))
        fi
        if [ ${POS} -eq 1 ]
        then
            echo "${Y},${X}" >> ${TBLMAP}
        fi
    done
    rm -f ${TBLLST}
    echo "Table Structures From ${DAT}"
    for XY in `cat ${TBLMAP}`
    do
        echo "sed -n '${XY}p' ${DAT}" >> ${RUNMAP}
    done
    chmod +x ${RUNMAP}
    ./${RUNMAP}
    

    此脚本将为您输出每个创建表语句。它还将包括DROP TABLE 语句。如果你不想要 drop table 语句,你这个:

    DAT=rolando.sql
    TBLMAP=tblmap.txt
    TBLLST=${TBLLST}.lst
    TBLTMP=${TBLMAP}.tmp
    RUNMAP=DisplayTables.sh
    grep -n "^CREATE TABLE" ${DAT} | sed 's/:/ /' | awk '{print $1}'  > ${TBLTMP}
    grep -n "^) ENGINE="    ${DAT} | sed 's/:/ /' | awk '{print $1}' >> ${TBLTMP}
    sort -n < ${TBLTMP} > ${TBLLST}
    rm -f ${TBLTMP}
    rm -f ${TBLMAP}
    POS=1
    for X in `cat ${TBLLST}`
    do
        (( POS = 1 - POS ))
        if [ ${POS} -eq 0 ]
        then
            (( Y = X ))
        fi
        if [ ${POS} -eq 1 ]
        then
            echo "${Y},${X}" >> ${TBLMAP}
        fi
    done
    rm -f ${TBLLST}
    echo echo "Table Structures From ${DAT}" > ${RUNMAP}
    for XY in `cat ${TBLMAP}`
    do
        echo "sed -n '${XY}p' ${DAT}" >> ${RUNMAP}
    done
    chmod +x ${RUNMAP}
    ./${RUNMAP}
    

    试试看!!!

    【讨论】:

      猜你喜欢
      • 2017-12-22
      • 2014-07-21
      • 2013-09-09
      • 1970-01-01
      • 2015-06-11
      • 2012-08-02
      • 2020-10-06
      • 2012-12-24
      • 1970-01-01
      相关资源
      最近更新 更多