Bắt các biến shell vào awk
có thể được thực hiện theo nhiều cách. Một số tốt hơn so với những người khác. Điều này sẽ bao gồm hầu hết trong số họ. Nếu bạn có một bình luận, xin vui lòng để lại dưới đây. v1.5
Sử dụng -v
(Cách tốt nhất, di động nhất)
Sử dụng -v
tùy chọn: (PS sử dụng khoảng trắng sau -v
hoặc nó sẽ ít di động hơn. Ví dụ: awk -v var=
không awk -vvar=
)
variable="line one\nline two"
awk -v var="$variable" 'BEGIN {print var}'
line one
line two
Điều này phải tương thích với hầu hết awk
và biến cũng có sẵn trong BEGIN
khối:
Nếu bạn có nhiều biến:
awk -v a="$var1" -v b="$var2" 'BEGIN {print a,b}'
Cảnh báo . Như Ed Morton viết, các chuỗi thoát sẽ được diễn giải để \t
trở thành hiện thực tab
và không phải \t
nếu đó là những gì bạn tìm kiếm. Có thể được giải quyết bằng cách sử dụng ENVIRON[]
hoặc truy cập thông quaARGV[]
PS Nếu bạn thích ba thanh dọc làm dấu phân cách |||
, nó không thể thoát được, vì vậy hãy sử dụng-F"[|][|][|]"
Ví dụ về việc lấy dữ liệu từ một nhà trọ chương trình / chức năng đến awk
(ngày này được sử dụng)
awk -v time="$(date +"%F %H:%M" -d '-1 minute')" 'BEGIN {print time}'
Biến sau khối mã
Ở đây chúng tôi nhận được các biến sau awk
mã. Điều này sẽ hoạt động tốt miễn là bạn không cần biến trong BEGIN
khối:
variable="line one\nline two"
echo "input data" | awk '{print var}' var="${variable}"
or
awk '{print var}' var="${variable}" file
awk '{print a,b,$0}' a="$var1" b="$var2" file
- Theo cách này, chúng tôi cũng có thể đặt Dấu tách trường khác nhau
FS
cho mỗi tệp.
awk 'some code' FS=',' file1.txt FS=';' file2.ext
- Biến sau khối mã sẽ không hoạt động cho
BEGIN
khối:
echo "input data" | awk 'BEGIN {print var}' var="${variable}"
Chuỗi đây
Biến cũng có thể được thêm vào awk
bằng cách sử dụng chuỗi ở đây từ các shell hỗ trợ chúng (bao gồm Bash):
awk '{print $0}' <<< "$variable"
test
Điều này giống như:
printf '%s' "$variable" | awk '{print $0}'
PS này coi biến là một đầu vào tập tin.
ENVIRON
đầu vào
Như TrueY viết, bạn có thể sử dụng ENVIRON
để in Biến môi trường . Đặt một biến trước khi chạy AWK, bạn có thể in nó ra như sau:
X=MyVar
awk 'BEGIN{print ENVIRON["X"],ENVIRON["SHELL"]}'
MyVar /bin/bash
ARGV
đầu vào
Như Steven Penny viết, bạn có thể sử dụng ARGV
để đưa dữ liệu vào awk:
v="my data"
awk 'BEGIN {print ARGV[1]}' "$v"
my data
Để lấy dữ liệu vào chính mã, không chỉ BEGIN:
v="my data"
echo "test" | awk 'BEGIN{var=ARGV[1];ARGV[1]=""} {print var, $0}' "$v"
my data test
Biến trong mã: SỬ DỤNG VỚI THẬN TRỌNG
Bạn có thể sử dụng một biến trong awk
mã, nhưng nó lộn xộn và khó đọc, và như đã Charles Duffy
chỉ ra, phiên bản này cũng có thể là nạn nhân của việc tiêm mã. Nếu ai đó thêm nội dung xấu vào biến, nó sẽ được thực thi như một phần của awk
mã.
Điều này hoạt động bằng cách trích xuất biến trong mã, vì vậy nó trở thành một phần của nó.
Nếu bạn muốn thực hiện một awk
thay đổi linh hoạt khi sử dụng các biến, bạn có thể thực hiện theo cách này, nhưng KHÔNG sử dụng nó cho các biến thông thường.
variable="line one\nline two"
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
Dưới đây là một ví dụ về tiêm mã:
variable='line one\nline two" ; for (i=1;i<=1000;++i) print i"'
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
1
2
3
.
.
1000
Bạn có thể thêm rất nhiều lệnh awk
theo cách này. Thậm chí làm cho nó sụp đổ với các lệnh không hợp lệ.
Thông tin thêm:
Sử dụng báo giá kép
Luôn luôn tốt để nhân đôi biến trích dẫn "$variable"
Nếu không, nhiều dòng sẽ được thêm dưới dạng một dòng dài.
Thí dụ:
var="Line one
This is line two"
echo $var
Line one This is line two
echo "$var"
Line one
This is line two
Các lỗi khác bạn có thể nhận được mà không cần trích dẫn kép:
variable="line one\nline two"
awk -v var=$variable 'BEGIN {print var}'
awk: cmd. line:1: one\nline
awk: cmd. line:1: ^ backslash not last character on line
awk: cmd. line:1: one\nline
awk: cmd. line:1: ^ syntax error
Và với trích dẫn duy nhất, nó không mở rộng giá trị của biến:
awk -v var='$variable' 'BEGIN {print var}'
$variable
Thông tin thêm về AWK và các biến
Đọc faq này .