从具有标准grep,egrep或awk

时间:2019-06-27 18:10:14

标签: bash shell awk grep

我正在尝试从grep输出中提取特定的字符串

uci show minidlna

产生大量列表

.
.
.
minidlna.config.enabled='1'
minidlna.config.db_dir='/mnt/sda1/usb/db'
minidlna.config.enable_tivo='1'
minidlna.config.wide_links='1'
.
.
.

所以我试图通过跑步缩小我想要的范围

uci show minidlna | grep -oE '\bdb_dir=\S+'

这会将输出范围缩小到

db_dir='/mnt/sda1/usb/db'

我只想输出

/mnt/sda1/usb/db

没有引号,也没有开头的“ db_dir”,因此我可以运行rm /mnt/sda1/usb/db/file.db

我用了这里找到的答案 How to extract string following a pattern with grep, regex or perl 就和我一样近。

编辑:在使用Ed Morton的awk命令之后,我需要将输出传递到rm命令。

我用过

| ( read DB; (rm $DB/files.db)

read DB将输出传递到可变DB中。

(...)组合命令。

rm $DB/files.db删除文件files.db

4 个答案:

答案 0 :(得分:2)

这是您要做什么吗?

$ awk -F"'" '/db_dir/{print $2}' file
/mnt/sda1/usb/db

这将在每个UNIX框的任何shell中的任何awk中工作。

如果这不是您想要的,那么请编辑您的问题以阐明您的要求并发布更真实的代表性示例输入/输出。

答案 1 :(得分:0)

使用sed避免单引号:

sed -n 's/^minidlna.config.db_dir=\s*\S\(\S*\)\S\s*$/\1/p' input

答案 2 :(得分:0)

好吧,因此您最终得到了一个像db_dir='/mnt/sda1/usb/db'这样的字符串。 首先,将其引至

来删除引号
.... |  tr -d "'"

现在,您将得到一个像db_dir=/mnt/sda1/usb/db这样的字符串。 假设您将此字符串存储在名为confstr的变量中,然后

${confstr##*=}

只给您/mnt/sda1/usb/db,因为*=表示从开始到等号的所有内容,而##表示删除。

答案 3 :(得分:0)

我会这样做:

一旦将行提取到file.txt中(或将其通过管道传递到此命令中),请使用引号将字段分开。使用printf生成rm命令并将其传递给bash以执行。

$ awk -F"'" '{printf "rm %s.db/file.db\n", $2}' file.txt  | bash
rm: /mnt/sda1/usb/db.db/file.db: No such file or directory

使用原始命令:

$ uci show minidlna | grep -oE '\bdb_dir=\S+' | \
       awk -F"'" '{printf "rm %s.db/file.db\n", $2}' | bash