您现在的位置是:网站首页 -> Linux 文章内容
awk内部调用shell命令-itarticl.cc-IT技术类文章记录&分享
发布时间: 7年前【Linux】 152人已围观【返回】
在awk中可以直接执行shell命令。这里的awk命令是处理的a.txt里面的文本,所以写入a.txt写删除自己
zoer@ubuntu:~$ echo "a.txt" -gt- a.txt; awk '{cmd="rm "$0;system(cmd)}' a.txt ; ls
a.txt dd important mysql py testdata
我们在awk中组装命令并且最后使用system()来执行。每次读入一个文件名并删除这个文件。
下面我们使用awk中执行命令来创建一些文件。
zoer@ubuntu:~$ awk 'BEGIN{count=10;i=0;while(i-lt-count){cmd="touch "i".txt";i++;system(cmd)}}'
zoer@ubuntu:~$ ls
0.txt 4.txt 8.txt dd jdk1.6.0_33 py
1.txt 5.txt 9.txt Desktop mysql stu
2.txt 6.txt daemon.py important mysql_install_db.sh stu.txt
3.txt 7.txt data installer Public testdata
补充效率问题:
在对squid进行目录刷新的时候,一般使用的脚本都是采用for i in squidclient mgr:objects|grep $1|awk '{print $2}';do squidclient -m purge “$i”;done的方式。
mgr:objects本来就是一个比较费资源的请求,假如一个200G的cache,这个$i变量该卡多久才能有反应?抑或直接挂掉……
于是把这个稍微改进一下,变成squidclient mgr:objects awk ‘/”‘$1’”/{system(“squidclient -m purge “$2)}’,因为awk对每行进行匹配后,就可以同时作出反应,所以比存一个大变量要好一些。
不过在使用中发现还有一些别的问题。比如碰到http://www.test.com/abc(123).html这样的url的时候,就会出错:
sh: -c: line 0: syntax error near unexpected token `(‘
url里的括号和awk函数的括号冲突了。所以对$2不能简单引用就完,还得处理。 CU上有人给出如下写法:
awk ‘{system(“squidclient -m purge ‘’’“$2”’’’”)}’
一试果然可以,试着分解一下这堆引号:
‘{system(“squidclient -m purge ‘第一部分,单引号表示里面的内容都传递给awk处理;
‘第二部分,shell环境下转义单引号为普通字符;
’“$2”‘第三部分,传递给awk,其中第一个”接第一部分的”,完成system函数的命令部分,其中包括了第二部分的普通字符’;
‘第四部分,shell环境下转义单引号为普通字符;
’”)}’第五部分,传递给awk,其中”接第三部分的第二个”,其中包含了第四部分的普通字符’;
合在一起,就给替换好的$2加上了一对’‘,然后通过system函数传递给shell执行。OK~~
getline:
先把文件列表存在filename文件中
先
awk '{system("rm $0")}' filename -------WRONG
因为对于 system来说 $0 不再是某行全部的内容,而是 “sh” , 上面的命令相当于执行“ sh rm sh”
然后
awk '{cmd="rm "$0;system(cmd)}' filename ----OK
下面的也ok
awk '{cmd="rm "$0;cmd|getline }' filename ---- OK
man awk里面关于getline的说明,大意是说 运行command,同时会把输出存在$0 里面,或参数var中。
command | getline [var]
Run command piping the output either into $0 or var, as above.
command |& getline [var]
Run command as a co-process piping the output either into $0 or var, as above.
Co-processes are a gawk extension.
awk程序中可接受下列两种语法:
[a. 语法] awk output 指令 | "Shell 接受的命令" ( 如 : print $1,$2 | "sort -k 1" )
awk input 指令只有 getline 一个. awk output 指令有 print, printf() 二个.
在a 语法中, awk所输出的数据将转送往 Shell , 由 Shell 的命令进行处理.以上例而言, print 所输出的数据将经由 Shell 命令 "sort -k 1" 排序后再送往屏幕(stdout).
上列awk程序中, "print$1, $2" 可能反复执行很多次, 其输出的结果将先暂存于 pipe 中,等到该程序结束时, 才会一并进行 "sort -k 1". 不论 print $1, $2 被执行几次, "sort -k 1" 的执行时间是 "awk程序结束时", "sort -k 1" 的执行次数是 "一次".
linux:/home/lxg # cat awk2.txt
aaa 12
bbb 4
ccc 9
linux:/home/lxg # cat awk2.txt | awk '{print $1,$2 | "sort -nk 2"}'
bbb 4
ccc 9
aaa 12
linux:/home/lxg # cat awk2.txt | awk '{print $1,$2}' | sort -nk 2
bbb 4
ccc 9
aaa 12
linux:/home/lxg #
[b. 语法] "Shell 接受的命令" | awk input 指令 ( 如 : "ls " | getline)
awk将先调用 Shell 命令. 其执行结果将通过 pipe 送入awk程序,以上例而言, awk先让 Shell 执行 "ls",Shell 执行后将结果存于 pipe, awk指令 getline再从 pipe 中读取数据. 使用本语法时应留心: 以上例而言,awk "立刻"调用 Shell 来执行 "ls", 执行次数是一次. getline 则可能执行多次(若pipe中存在多行数据).
[plain] view plain copy
linux:/home/lxg # awk 'BEGIN{while(getline line -lt- "awk1.txt"){print line}}'
web01[192.168.2.100]
httpd ok
tomcat ok
sendmail ok
web02[192.168.2.101]
httpd ok
postfix ok
web03[192.168.2.102]
mysqld ok
httpd ok
linux:/home/lxg # awk 'BEGIN{ while( system("ls -l") | getline line ){ print line } }'
total 7813824
-rw-r--r-- 1 root root 134 Jul 16 15:10 awk1.txt
-rwxr-xr-x 1 root root 250 Jul 12 13:01 c.py
-rw-r--r-- 1 root root 50 Jul 13 14:46 err.txt
-rw-r--r-- 1 root root 30 Jul 13 14:59 in.txt
-rw-r--r-- 1 root root 55 Jul 13 14:51 log.txt
-rw-r--r-- 1 root root 525752 Jul 11 17:45 phone.txt
drwxr-xr-x 2 root root 516096 Jul 12 12:15 phone_sample
-rw-r--r-- 1 root root 7991494657 Jul 12 13:17 phone_sample.tar.gz
-rw-r--r-- 1 root root 5 Jul 13 14:46 r.txt
-rw-r--r-- 1 root root 556812 Jul 12 11:54 samplelist.txt
-rw-r--r-- 1 root root 393348 Jul 12 10:32 samplelist2.txt
sh: 0: command not found
linux:/home/lxg # awk 'BEGIN{ while("ls -l"| getline line -gt-0){ print line } }'
total 7813824
-rw-r--r-- 1 root root 134 Jul 16 15:10 awk1.txt
-rwxr-xr-x 1 root root 250 Jul 12 13:01 c.py
-rw-r--r-- 1 root root 50 Jul 13 14:46 err.txt
-rw-r--r-- 1 root root 30 Jul 13 14:59 in.txt
-rw-r--r-- 1 root root 55 Jul 13 14:51 log.txt
-rw-r--r-- 1 root root 525752 Jul 11 17:45 phone.txt
drwxr-xr-x 2 root root 516096 Jul 12 12:15 phone_sample
-rw-r--r-- 1 root root 7991494657 Jul 12 13:17 phone_sample.tar.gz
-rw-r--r-- 1 root root 5 Jul 13 14:46 r.txt
-rw-r--r-- 1 root root 556812 Jul 12 11:54 samplelist.txt
-rw-r--r-- 1 root root 393348 Jul 12 10:32 samplelist2.txt
发布时间: 7年前【Linux】152人已围观【返回】【回到顶端】
很赞哦! (1)
相关文章
点击排行

站长推荐

猜你喜欢
站点信息
- 建站时间:2016-04-01
- 文章统计:728条
- 文章评论:82条
- QQ群二维码:扫描二维码,互相交流
