首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用tac、grep和sed...in reverse从MySQL转储中提取表

问使用tac、grep和sed...in reverse从MySQL转储中提取表
EN

Stack Overflow用户
提问于 2013-01-09 02:05:47
回答 2查看 1.8K关注 0票数 2

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

代码语言:javascript
复制
 grep -n "Table structure" [MySQL_dump_filename].sql

它获取表定义的行号,然后

代码语言:javascript
复制
 sed -n '[starting_line_number],[ending_line_number] p' [MySQL_dump_filename].sql > [table_output_filename].sql

我想以相反的顺序搜索.sql转储,因为我需要的是接近文件末尾的位置,并且需要相当长的时间来grep第一个48 in的数据。我使用的是OS并安装了tac (通过brew,如前面提到的here)。但是,是否可以设置该命令来完成此操作,并在sed获取所需的行后让它退出?如果不是,我不妨从头开始使用grep,根本不使用tac,只需等待它结束。或ctrl-c,一旦我看到文件填充在另一个终端。

示例运行:

代码语言:javascript
复制
$ 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`
...

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

EN

回答 2

Stack Overflow用户

发布于 2013-01-09 02:22:21

以下是一些快速提示:

  • dd可以帮助您跳过非常快的N字节/块/任何东西如果您确定前N gb不再有用跳过后,无需1) grep查找行号然后2) sed跳到行号n(读取剩余大小的两倍):您可以直接:

awk '/beginningpattern/,/endpattern/ { print $0 ; }' #warning:语法不完整,最好先了解一下awk及其强大功能。你可以做所有整洁的事情。

票数 1
EN

Stack Overflow用户

发布于 2013-01-09 02:54:01

这是一种更简单的方法,可以知道所有表定义的开始和结束位置。

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

代码语言:javascript
复制
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语句,您可以使用以下语句:

代码语言:javascript
复制
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}

试一试吧!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14221302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档