当前位置: 技术问答>linux和unix
shell脚本中使用awk的疑惑,请帮忙
来源: 互联网 发布时间:2016-06-14
本文导语: #!/bin/sh for file_name in `ls src` do echo ${file_name} awk -F ";" '{if($4 == ?????) print}' ${file_name} >> list done; 我要检索src目录中的文件,对每一个文件进行分析,如果文件的第4个字段符合一定条件...
#!/bin/sh
for file_name in `ls src`
do
echo ${file_name}
awk -F ";" '{if($4 == ?????) print}' ${file_name} >> list
done;
我要检索src目录中的文件,对每一个文件进行分析,如果文件的第4个字段符合一定条件,比如说,第4个字段是"a123",则将这些符合条件的记录保存成另外一个文件;该条件,我想在整个shell脚本的$1参数地方体现。
如上脚本,我现在想在?????处引用该shell脚本的第一个参数$1,请问,?????该怎么写?
for file_name in `ls src`
do
echo ${file_name}
awk -F ";" '{if($4 == ?????) print}' ${file_name} >> list
done;
我要检索src目录中的文件,对每一个文件进行分析,如果文件的第4个字段符合一定条件,比如说,第4个字段是"a123",则将这些符合条件的记录保存成另外一个文件;该条件,我想在整个shell脚本的$1参数地方体现。
如上脚本,我现在想在?????处引用该shell脚本的第一个参数$1,请问,?????该怎么写?
|
只有一种方法,而且必须严格按照格式,假如是第一个参数的话,则为
'"${1}"'
有不明白的地方可以问我。。
算了,我写出来给你看吧。。。。。。。。
[root@manifold ~]# ls
anaconda-ks.cfg Desktop install.log install.log.syslog test2.sh test.sh
[root@manifold ~]# cat test.sh
#!/bin/sh
for file_name in `ls /root`
do
echo ${file_name}
awk -F ";" '{if($4 == '"${1}"') print}' ${file_name} >> list
done;
[root@manifold ~]# cat test2.sh
manifold;manifold2;manifold3;1234;end
[root@manifold ~]# ls
anaconda-ks.cfg Desktop install.log install.log.syslog test2.sh test.sh
[root@manifold ~]# sh test.sh 1234
anaconda-ks.cfg
Desktop
awk: cmd. line:1: fatal: file `Desktop' is a directory
install.log
install.log.syslog
test2.sh
test.sh
[root@manifold ~]# ls
anaconda-ks.cfg Desktop install.log install.log.syslog list test2.sh test.sh
[root@manifold ~]# cat list
manifold;manifold2;manifold3;1234;end
[root@manifold ~]#
'"${1}"'
有不明白的地方可以问我。。
算了,我写出来给你看吧。。。。。。。。
[root@manifold ~]# ls
anaconda-ks.cfg Desktop install.log install.log.syslog test2.sh test.sh
[root@manifold ~]# cat test.sh
#!/bin/sh
for file_name in `ls /root`
do
echo ${file_name}
awk -F ";" '{if($4 == '"${1}"') print}' ${file_name} >> list
done;
[root@manifold ~]# cat test2.sh
manifold;manifold2;manifold3;1234;end
[root@manifold ~]# ls
anaconda-ks.cfg Desktop install.log install.log.syslog test2.sh test.sh
[root@manifold ~]# sh test.sh 1234
anaconda-ks.cfg
Desktop
awk: cmd. line:1: fatal: file `Desktop' is a directory
install.log
install.log.syslog
test2.sh
test.sh
[root@manifold ~]# ls
anaconda-ks.cfg Desktop install.log install.log.syslog list test2.sh test.sh
[root@manifold ~]# cat list
manifold;manifold2;manifold3;1234;end
[root@manifold ~]#
|
当然是用-v参数
$ lf
awkvar* src/
$ cat awkvar
#! /bin/sh
files=`ls src/*`
for file_name in ${files}
do
awk -F ":" -v country=China '{ if($4 == country) print }' ${file_name}
done
$ ls src
software.txt whoiswho.txt
$ cat src/*
Microsoft:Windows:XP:USA
SCO:SCO Open Server:5.0.5:USA
Kingsoft:Power Dict:2006:China
Tongtech:TongLINK/Q:6.3:China
Bill Gates:Micosft:CEO:USA
Liu Chuanzhi:Lenovo:CEO:China
$ ./awkvar
Kingsoft:Power Dict:2006:China
Tongtech:TongLINK/Q:6.3:China
Liu Chuanzhi:Lenovo:CEO:China
|
其实不用你们讲的那么麻烦
直接把楼主说的????变成"'$1'"即可 即双引号单引号$1单引号双引号
我测试过 也这么用过
#!/bin/sh
for file_name in `ls src`
do
echo ${file_name}
awk -F ";" '{if($4 == "'$1'") print}' ${file_name} >> list
done;
直接把楼主说的????变成"'$1'"即可 即双引号单引号$1单引号双引号
我测试过 也这么用过
#!/bin/sh
for file_name in `ls src`
do
echo ${file_name}
awk -F ";" '{if($4 == "'$1'") print}' ${file_name} >> list
done;
|
顶
|
说的没错,俺也是试验了一下,后来在网上找的这么一个帖子,说的比较全面:
http://www.lazysa.com/2009/06/490.html
所以俺把上面的改了改
#! /bin/sh
for f in "`ls src/*`"
do
awk -F ":" '$4 == "'"$1"'" || $2 == "'"$2"'" { print }' ${f}
|
#! /bin/sh
for f in "`ls src/*`"
do
awk -F ":" '$4 == "'"$1"'" || $2 == "'"$2"'" { print }' ${f}
done
执行结果如下:
./sh2awk China "SCO Open Server"
SCO:SCO Open Server:5.0.5:USA
Kingsoft:Power Dict:2006:China
Tongtech:TongLINK/Q:6.3:China
Liu Chuanzhi:Lenovo:CEO:China
|
顶这个了 awk 的外参标准格式 就是这个鸟
|
原来还有那么多种方法,学习了