2

我正在按照本指南使用 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 如此所述)。但是是否可以设置命令来完成此操作并在 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将从文件的开头开始计算)。

4

2 回答 2

1

一些快速指示:

  • dd可以帮助您快速跳过N 个字节/块/如果您确定那些第一个 N gb 没有用处

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

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

于 2013-01-08T18:22:20.550 回答
0

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

对于给定的文件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}

试试看 !!!

于 2013-01-08T18:54:00.883 回答