使用tac、grep和sed从MySQL转储中提取表…相反

使用tac、grep和sed从MySQL转储中提取表…相反,mysql,sed,grep,Mysql,Sed,Grep,我正在使用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 不过,我希

我正在使用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转储,因为我需要的是接近文件末尾的部分,并且需要花费相当长的时间才能对前48GB的数据进行grep。我使用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“752779 p”,但从文件末尾开始,您将得到错误的行号(sed将从文件开头开始计算)。

一些快速指针:

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

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

    awk'/beginingpattern/,/endpattern/{print$0;}'
    #警告:语法不完整,最好阅读awk及其威力。你可以做各种整洁的事情


这里有一种更简化的方法来了解所有表定义的开始和结束位置

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

试试看

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