[英]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.