awk bash shell中的字符串替换

时间:2015-01-23 07:33:02

标签: bash shell awk

cat filenames.txt
Document a.txt
Document b.txt
Document c.txt

因为我需要tar三个文件,所以我使用命令行

tar -cvzf backup.tar.gz "Document a.txt" "Document b.txt" "Document c.txt"

为了做到这一点:

cat filenames.txt | awk '{  how to add " "double quatation mark to file names}' | xargs tar -cvzf backup.tar.gz

问题: 1.如何为awk {...}编写代码?感谢。

2.When()包含在文件名中,为什么tar命令不起作用?如何使用tar处理特殊字符?

3 个答案:

答案 0 :(得分:3)

您可以使用-T
将文件传递给tar命令 然后它将读取文件并在其中添加所有文件。

tar -cvzf backup.tar.gz -T filenames.txt

实施例

$cat filenames.txt
Document a.txt
Document b.txt
Document c.txt

$tar -cvzf backup.tar.gz -T filenames.txt
Document a.txt
Document b.txt
Document c.txt

$tar -tvf backup.tar.gz
-rw-r--r-- me        4 2015-01-23 08:32 Document a.txt
-rw-r--r-- me        4 2015-01-23 08:32 Document b.txt
-rw-r--r-- me        4 2015-01-23 08:32 Document c.txt

手册页条目

  

-T, - files-from = FILE
  获取要从FILE中提取或创建的名称

答案 1 :(得分:2)

您可以使用xargs -I

cat filenames.txt | xargs -I {} tar -rvf backup.tar '{}'
gzip backup.tar

答案 2 :(得分:1)

如果您需要使用awk并且指定/生成类似STRING<SPACE>STRING.txt的文件格式,您也可以使用printf

awk '{ printf "\"%s %s\"\n", $1, $2 }' files.txt | xargs tar -cvzf backup.tgz

AWK是处理生成的行和列的绝佳过滤器。

由于您不需要过滤数据,因此您可以按原样行。

$ awk '{ printf "%s\n", $0; }' files.txt | xargs -I {} tar -rvf backup.tar {}
Document A.txt
Document B.txt

或没有printf(整行)

$ awk '{ print; }' files.txt | xargs -I {} tar -rvf backup.tar {}

并在最后一步压缩它,gzip无法更新压缩档案:

$ gzip backup.tar