簡體   English   中英

AWK轉義字符混亂

[英]AWK Escape Characters Confusion

所以我一直在做一些關於AWK的閱讀,但是我似乎在執行以下代碼時遇到問題:

curl http://website.com/users.csv | tac | tac | sed '101,400!d' | grep "female" |
awk -F',' '{ print "sudo useradd -Db /home/gender/female" " " $1 " " "-c" " " \"$5 " " $6\""}' |
bash

我試圖在$5之前和$6之后立即轉義雙引號,以便我可以從AWK進行系統調用,也可以僅管道傳輸到bash。 由於某些原因,我的轉義字符不起作用。 我沒有閱讀有關轉義序列的GNU AWK摘要。

我該怎么做?

輸出應如下所示:

sudo useradd -Db /home/gender/female dinessid1965 -c "Marina Propst"

輸入看起來像這樣:

reatim,Shephoi8v,female,Ms.,Eija,Kankkunen,4721 Pearcy Avenue,Fort Wayne,IN,46804,,260-715-7242,2/22/84,Pisces,Dermatologist

首先,為了避免轉義:單獨引用所有內容,會使您的生活變得比必要的更加艱難。 代替

print "sudo useradd -Db /home/gender/female" " " $1 " " "-c" " " \"$5 " " $6\""

你可以寫

print "sudo useradd -Db /home/gender/female " $1 " -c " \"$5 " " $6\""

在這點上,引號似乎有些錯了:GNU Awk抱怨\\不是該行的最后一個字符。

您可以這樣寫,在引號之間使用轉義的引號\\"

print "sudo useradd -Db /home/gender/female " $1 " -c \"" $5 " " $6 "\""

或者,為了便於閱讀,請指定一個包含雙引號的變量(請參見手冊 ):

awk -v dq='"' '{ print "sudo useradd -Db /home/gender/female " $1 " -c " dq $5 " " $6 dq }'

其次,你的整個鏈條可以簡化為: tac | tac tac | tac不執行任何操作,而grep和sed可以通過awk完成:

curl http://website.com/users.csv |
awk -F, -v dq='"' '/female/ && NR >= 101 && NR <= 400 { \
 print "sudo useradd -Db /home/gender/female " dq $1 dq " -c " dq $5 " " $6 dq }' |
bash

另外,為避免使用print在變量之間添加空格的麻煩,我們可以使用printf (感謝Ed Morton的推動):

curl http://website.com/users.csv |
awk -F, '/female/ && NR >= 101 && NR <= 400 { \
printf "sudo useradd -Db /home/gender/female \"%s\" -c \"%s %s\"\n", $1, $5, $6 }' |
bash

請注意,在最后兩個命令中還如何引用$1的擴展名,以防止shell專用字符(甚至是惡意命令)產生副作用。

通過完全使用awk,您將變得比必要的要難。 這也是很危險的,因為您沒有為shell引用$1$5$6的內容。 如果它們包含任何有趣的字符,則您會遇到麻煩。

您可以完全安全地進行bash操作:

curl http://website.com/users.csv | sed '101,400!d' | grep "female" |
while IFS=, read -a words; do
    sudo useradd -Db /home/gender/female "${words[0]}" -c "${words[4]} ${words[5]}"
done

盡管為了提高安全性,您可能需要確保用戶名字段不包含任何可疑內容(例如,以../開頭)。 我不知道要檢查useradd多少。

您使用了太多的報價!

這是一個簡單的示例,您可以將其更改為格式

$ echo dinessid1965,two,three,four,Marina,Propst |
   awk -F, -v q='"' '{print "sudo ...", $1, "-c", q $5, $6 q}'  

sudo ... dinessid1965 -c "Marina Propst"

暫無
暫無

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

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