2010-06-23 39 views
14

Tôi có kịch bản trông như thế nàyLàm thế nào để làm cho AWK sử dụng biến được tạo ra trong Bash Script

#!/bin/bash 
#exampel inputfile is "myfile.txt" 
inputfile=$1 
basen=`basename $inputfile .txt` # create basename 

cat $inputfile | 
awk '{print $basen "\t" $3} # this doesn't print "myfile" but the whole content of it. 

Những gì tôi muốn làm trên là để in ra trong AWK biến gọi là 'Basen' tạo ra trước đó. Nhưng bằng cách nào đó nó không làm được những gì tôi hy vọng nó sẽ.

Vì vậy, ví dụ myfile.txt chứa những dòng

foo bar bax 
foo qux bar 

Với kịch bản bash trên, chúng tôi hy vọng sẽ nhận

myfile bax 
myfile bar 

đúng cách để làm điều đó là gì?

Trả lời

12

Bạn có thể sử dụng nó như thế này.

for i in `find $1 -name \*.jar` 
do 
jar tvf $i| awk -F '/' '/class/{print "'${i}'" " " $NF }' >> $classFile 
done 

Bạn nên sử dụng

" '$ {i}'"

trong AWK sử dụng

$ i

tạo trong Bash Scr ipt.

+2

sử dụng '$()' thay vì backticks. Và 'tìm' với vòng lặp' for' như thế sẽ phá vỡ các tệp có dấu cách. Trích dẫn biến '$ 1' của bạn là – ghostdog74

2

Lý do là các biến bash (biến môi trường) không được mở rộng trong các chuỗi được trích dẫn một lần. Hãy thử thay thế

'{print $basen "\t" $3}' 

với

"{print \"$basen\" \"\t\" \$3}" 
+0

có một đá quý ngay tại đó :) cảm ơn bạn DavidZ! – Deian

29

Cờ -v là để thiết lập biến từ dòng lệnh. Hãy thử một cái gì đó như thế này:

awk -v "BASEN=$basen" '{print BASEN "\t" $3}' 
+2

+1 Đây là cách tốt nhất để chèn biến vì nó sẽ hoạt động ngay cả khi '$ basen' chứa các ký tự đặc biệt như dấu nháy đơn, dấu ngoặc kép hoặc dấu cách. –

1

Cách dễ nhất là tạo biến awk. awk -v awkvar=$bashvar 'awkscript'.

+0

, bạn sẽ cần đặt« awkvar = $ bashvar' vào hai dấu ngoặc kép, nếu không nó sẽ có vấn đề với bashvariables với dấu cách trong đó: 'awk -v' awkvar = $ bashvar '' awkscript'' – syss

4

bạn chỉ có thể làm mọi thứ trong awk

awk '{gsub(".txt","",ARGV[1]);print ARGV[1] "\t" $3}' inputfile.txt 
3

Giả sử bạn chạy awk là quá trình phụ của vỏ bạn tuyên bố vars
Trong vỏ

export MY_VARS="whatever"; #// IT NEEDS to be exported, to allow the sub process awk read access. 
echo ""| awk '{ 
    print "Reading values from within awk : "ENVIRON["MY_VARS"]; 
}' 

Kết quả:

Giá trị đọc từ bên trong awk: bất cứ điều gì

chú ý đến tầm quan trọng của xuất. Với nó, các vars từ vỏ được coi là địa phương và không được chuyển cho các quá trình đồng.

Các vấn đề liên quan