使用tac,grep和sed ...从MySQL转储中提取表格

时间:2013-01-08 18:05:47

标签: mysql sed grep

我在使用grep从mysql转储中提取表时遵循this guide,所以我不必恢复所有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转储,因为我需要的是文件的末尾,并且需要很长时间才能通过第一个48GB的数据进行grep。我在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',但是从文件的末尾开始,否则你会得到错误的行number(sed将从文件的开头开始计算)。

2 个答案:

答案 0 :(得分:1)

一些快速指示:

  • dd可以帮助您跳过非常快 N个字节/块/无论您确定第一个N gb无效

  • 跳过后,无需1)grep找到行号,然后2)sed跳到行号n(读取剩余的两倍):你可以直接:< / p>

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

答案 1 :(得分: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}

此脚本将为您输出每个create table语句。它还将包括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}

试一试!!!