2013-11-20 34 views
2
$ cat file 
11 asasaw121 
12 saasks122 
13 sasjaks22 

$ cat no 
while read line 
do 
var=$(awk '{print $1}' $line) 
echo $var 
done<file 

$ cat yes 
while read line 
do 
var=$(echo $line | awk '{print $1}') 
echo $var 
done<file 

$ sh no 
awk: can't open file 11 
source line number 1 

awk: can't open file 12 
source line number 1 

awk: can't open file 13 
source line number 1 

$ sh yes 
11 
12 
13 

为什么第一个工作不起作用? awk希望在$ 1中找到什么?我认为理解这将帮助我避免许多脚本问题。awk在读取行为中的行为

回答

3

awk总是需要一个文件名作为输入

在下面,$line是字符串不是一个文件。

var=$(awk '{print $1}' $line) 

可以说(注意周围可变双引号)

var=$(awk '{print $1}' <<<"$line") 
2

Why doesn't the first one work?

因为该行的:

var=$(awk '{print $1}' $line) 

假定$line是一个文件。

你可以把它:

var=$(echo "$line" | awk '{print $1}') 

OR

var=$(awk '{print $1}' <<< "$line") 
+0

我需要输入'#define SERVER @“http://10.35.42.54/ms0.8”'到特定的行。我如何使用'awk'或'sed'来实现这个功能? –

+0

抱歉实现了什么?你想从'#define SERVER @“http:// 10.35.42.54/ms0.8'行中提取什么? – anubhava

+0

只需要将这个字符串放在一个特定文本文件的第50行就可以了。就是这样。 –

1
awk '{print $1}' $line 
       ^^ awk expects to see a file path or list of file paths here 
        what it is getting from you is the actual file line 

你想要做什么是管行成awk正如你在第二个例子做。

1

你已经得到了你的具体问题的答案,但我不确定你很清楚,你永远不会实际做任何上述事情。

从文件打印第一场你会做这一点:

while IFS= read -r first rest 
do 
    printf "%s\n" "$first" 

done < file 

或本:

awk '{print $1}' file 

或本:

cut -d ' ' -f1 <file 

外壳循环会不建议。