Bash - 使用awk分隔单词来解析长字符串

时间:2014-05-07 14:23:09

标签: bash shell parsing awk mysqldump

我正在使用bash脚本执行一些mysqldump备份。我不擅长编写脚本。

我有:

#!/bin/bash
TNAMES="database1.tableA database2.tableD databaseN.tableZ"

我需要解析TNAMES以将数据库部分与表部分分开以执行mysqldump

for TABLE in $TNAMES
do
  mysqldump $OPTIONS $USER $PASSWORD $DB $TABLENAME > "some_file.sql"
  (some more actions here)
done

所以在第一次循环迭代中,命令将是:

mysqldump $OPTIONS $USER $PASSWORD database1 tableA > "some_file.sql"

下一步:

mysqldump $OPTIONS $USER $PASSWORD database2 tableD > "some_file.sql"

下一步:

  mysqldump $OPTIONS $USER $PASSWORD databaseN tableZ > "some_file.sql"

等等。

使用awk有什么简单的方法吗?

4 个答案:

答案 0 :(得分:2)

你不需要sed,awk或cut来执行简单的前缀/后缀删除:

for spec in $TNAMES; do
  db=${spec%%.*}
  tb=${spec#*.}
  mysqldump ... $db $tb > $somewhere
done

答案 1 :(得分:1)

你可以使用“cut”:

for TABLE in $TNAMES
do
      DB=$(echo "$TABLE" | cut -d '.' -f 1)
      TABLENAME=$(echo "$TABLE" | cut -d '.' -f 2)
      mysqldump "$OPTIONS" "$USER" "$PASSWORD" "$DB" "$TABLENAME" > "some_file.sql"
done

答案 2 :(得分:1)

由于您在bash中启动变量,因此可以使用数组:

Database[0]="database1"
Database[1]="database2"
...

Table[0]="tableA"
Table[1]="tableB"
...


# Loop over the table index
for i in $(seq 0 $((${#Database[@]}-1)))
do
   mysqldump $OPTIONS $USER $PASSWORD ${Database[$i]} ${Table[$i]} >> "some_file.sql"
done

我冒昧地发生在文件>>上,而不是每次都创建一个新文件。

答案 3 :(得分:0)

你也可以使用像

这样的东西
#!/bin/bash

TNAMES="database1.tableA database2.tableD databaseN.tableZ"
for TABLE in "$TNAMES"
do
    while IFS='.' read DB TABLENAME
    do 
      mysqldump "$OPTIONS" "$USER" "$PASSWORD" "$DB" "$TABLENAME" > "some_file.sql"
    done <<<"$TABLE";
done