我跟随this guide使用grep从mysql转储中提取一个表,因此我不必恢复所有50 at的数据来查看一个表。拉取表的两个主要命令是:
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第一个48 in的数据。我使用的是OS并安装了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`
...当然,这些是相反的行号,所以如果你需要‘-n’表,你需要sed模板'752,779 p',但是从文件的末尾开始,你会得到错误的行号(sed将从文件的开头开始计数)。
发布于 2013-01-09 02:22:21
以下是一些快速提示:
dd可以帮助您跳过非常快的N字节/块/任何东西如果您确定前N gb不再有用跳过后,无需1) grep查找行号然后2) sed跳到行号n(读取剩余大小的两倍):您可以直接:awk '/beginningpattern/,/endpattern/ { print $0 ; }' #warning:语法不完整,最好先了解一下awk及其强大功能。你可以做所有整洁的事情。
发布于 2013-01-09 02:54:01
这是一种更简单的方法,可以知道所有表定义的开始和结束位置。
对于给定文件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}试一试吧!
https://stackoverflow.com/questions/14221302
复制相似问题