Linux | c&cpp | Email | github | QQ群:425043908 关注本站

itarticle.cc

您现在的位置是:网站首页 -> 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年前Linux152人已围观返回回到顶端

很赞哦! (1)

文章评论

  • 请先说点什么
    热门评论
    151人参与,0条评论

站点信息

  • 建站时间:2016-04-01
  • 文章统计:728条
  • 文章评论:82条
  • QQ群二维码:扫描二维码,互相交流