簡體   English   中英

從具有標准grep,egrep或awk的行中提取特定字符串

[英]Extract specific string from line with standard grep,egrep or awk

我正在嘗試從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

我用這里找到的答案如何按照grep,regex或perl的模式提取字符串 ,這與我所獲得的接近。

編輯:使用Ed Morton的awk命令后,我需要將輸出傳遞給rm命令。

我用了:

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

read DB將輸出傳遞到vairable DB

(...)合並命令。

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

這是您要做什么?

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

它將在每個UNIX機器上的任何shell中的任何awk中工作。

如果這不是您想要的,請編輯您的問題以闡明您的要求並發布更真實的代表性示例輸入/輸出。

盡力使用sed避免單引號:

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

好吧,所以您最終得到了一個類似db_dir='/mnt/sda1/usb/db'的字符串。 我首先將其引號刪除

.... |  tr -d "'"

現在,您最終得到一個類似於db_dir=/mnt/sda1/usb/db的字符串。 假設您將此字符串存儲在名為confstr的變量中,然后

${confstr##*=}

僅給您/mnt/sda1/usb/db ,因為*=表示從開始到等號的所有內容,而##表示刪除。

我會這樣做:

一旦將行提取到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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM