shell premote awk
if [ $? -eq 0 ] then echo "Success" fi
另一种方法:
[ $? -eq 0 ] && echo "Success"
这条命令也不够好:
$ grep 502 /etc/passwd | awk -F":" '{print $1}'
这才是一条好的命令:
$ awk -F":" '$3==502{print $1}' /etc/passwd
------------------------------------------------------------------------------------------
#!/bin/sh export remote_server="10.46.36.97" export remote_user="art" export remote_dir="/home/${remote_user}/art_test" if [ "$1" = "init" ]; then ssh-copy-id ${remote_user}@${remote_server} else remote_sh="run.sh" local_dir="/tmp/$USER/test-$$" rm -rf $local_dir mkdir -p $local_dir cd $local_dir scp ${remote_user}@${remote_server}:${remote_dir}/${remote_sh} . > /dev/null 2>&1 if [ $? != 0 ]; then echo "Cannot connect to ${remote_server} !" exit 1 fi bash ${remote_sh} rm -rf $local_dir fi
--------------------------------------------------------------------------------------
01-01 00:25:01.718 972 972 I dex2oat : dex2oat took 7.370s (threads: 8) arena alloc=2336B java alloc=5MB native alloc=10MB free=4MB dex_size=29MB oat_size=30MB
01-01 00:25:01.723 777 777 I dex2oat : dex2oat took 8.117s (threads: 8) arena alloc=2816B java alloc=8MB native alloc=13MB free=4MB dex_size=29MB oat_size=30MB
01-01 00:25:10.677 1224 1224 I dex2oat : dex2oat took 344.318ms (threads: 4) arena alloc=0B java alloc=140KB native alloc=203KB free=92KB dex_size=69KB oat_size=76KB
01-01 00:25:10.678 1222 1222 I dex2oat : dex2oat took 381.618ms (threads: 4) arena alloc=0B java alloc=131KB native alloc=203KB free=92KB dex_size=69KB oat_size=76KB
01-01 00:25:17.499 1246 1246 I dex2oat : dex2oat took 16.788ms (threads: 4) arena alloc=608B java alloc=99KB native alloc=334KB free=93KB dex_size=44KB oat_size=52KB
01-01 00:25:17.991 1253 1253 I dex2oat : dex2oat took 456.673ms (threads: 4) arena alloc=536B java alloc=5MB native alloc=2MB free=454KB dex_size=6MB oat_size=6MB
01-01 00:25:18.036 1260 1260 I dex2oat : dex2oat took 13.822ms (threads: 4) arena alloc=536B java alloc=62KB native alloc=333KB free=94KB dex_size=20KB oat_size=28KB
01-01 00:25:18.291 1267 1267 I dex2oat : dex2oat took 224.525ms (threads: 4) arena alloc=0B java alloc=2MB native alloc=1342KB free=353KB dex_size=2MB oat_size=2MB
01-01 00:26:21.540 1589 1589 I dex2oat : dex2oat took 58.299s (threads: 8) arena alloc=8MB java alloc=9MB native alloc=99MB free=17MB dex_size=29MB oat_size=65MB
01-01 00:26:23.214 1988 1988 I dex2oat : dex2oat took 1.239s (threads: 4) arena alloc=1452KB java alloc=207KB native alloc=2MB free=58KB dex_size=69KB oat_size=168KB
01-01 00:26:23.351 1563 1563 I dex2oat : dex2oat took 60.240s (threads: 8) arena alloc=8MB java alloc=12MB native alloc=118MB free=20MB dex_size=29MB oat_size=75MB
01-01 00:26:23.902 2001 2001 I dex2oat : dex2oat took 105.190ms (threads: 4) arena alloc=1337KB java alloc=263KB native alloc=2MB free=71KB dex_size=69KB oat_size=192KB
01-01 00:26:25.249 2019 2019 I dex2oat : dex2oat took 283.700ms (threads: 4) arena alloc=559KB java alloc=110KB native alloc=1034KB free=45KB dex_size=44KB oat_size=160KB
01-01 00:26:31.211 2026 2026 I dex2oat : dex2oat took 5.917s (threads: 4) arena alloc=3MB java alloc=6MB native alloc=42MB free=2MB dex_size=6MB oat_size=30MB
01-01 00:26:31.301 2033 2033 I dex2oat : dex2oat took 39.411ms (threads: 4) arena alloc=196KB java alloc=84KB native alloc=798KB free=53KB dex_size=20KB oat_size=68KB
01-01 00:26:33.469 2040 2040 I dex2oat : dex2oat took 2.127s (threads: 4) arena alloc=4MB java alloc=2MB native alloc=16MB free=1237KB dex_size=2MB oat_size=7MB
01-01 00:26:34.570 2076 2076 I dex2oat : dex2oat took 26.880ms (threads: 4) arena alloc=3KB java alloc=20KB native alloc=333KB free=94KB dex_size=504B oat_size=12KB
01-01 00:26:34.774 2083 2083 I dex2oat : dex2oat took 90.596ms (threads: 4) arena alloc=565KB java alloc=152KB native alloc=1727KB free=84KB dex_size=86KB oat_size=252KB
01-01 00:26:34.871 2090 2090 I dex2oat : dex2oat took 65.749ms (threads: 4) arena alloc=115KB java alloc=102KB native alloc=855KB free=40KB dex_size=37KB oat_size=116KB
$ grep "dex2oat took" file | awk -F " " '{if($10~"ms"){sub("ms","",$10);print $10} else if($10~"us"){print $10} else if($10~/[0-9]s$/){sub("s","",$10);sub("\.","",$10);print $10} else {print $10}}'
7370
8117
344.318
381.618
16.788
456.673
13.822
224.525
58299
1239
60240
105.190
283.700
5917
39.411
2127
26.880
90.596
65.749
$ grep "dex2oat took" FILENAME.LOG | awk -F " " 'BEGIN {sum=0}{if($10~"ms"){sub("ms","",$10);sum=sum+$10} else if($10~"us"){print $10} else if($10~/[0-9]s$/){sub("s","",$10);sub("\.","",$10);sum=sum+$10} else {print $10}}END{print "sum is ", sum}'
$ awk -F " " 'BEGIN {sum=0}/dex2oat took/{if($10~"ms"){sub("ms","",$10);sum=sum+$10} else if($10~"us"){print $10} else if($10~/[0-9]s$/){sub("s","",$10);sub("\.","",$10);sum=sum+$10} else {print $10}}END{print "sum is ", sum}' FILENAME.LOG
--------------------------------------------------------------------------------------------------------------
# 显示第xx行的第yy列的一个字符
sed -n 'xx,xxp' file | awk '{print substr($0,yy,1);}'
# 修改第xx行的第yy列的一个字符Chr,并保存为新文件
awk -F "" 'BEGIN { OFS="" }{if(NR == xx) for(i=yy;i<=yy;i++) {$i="Chr";} print }' file > newfile
file内容:
123abc456aababc789abcqweabcrtyabc
替换第9个字符到第19个字符之间的abc为xyz:
awk -F "" 'BEGIN { OFS="" } {for(i=9;i<=19;i++) if($i=="a" && $(i+1)=="b" && $(i+2)=="c"){$i="x";$(i+1)="y";$(i+2)="z"}print }' file
----------------------------------------------------------------------------------
awk内置变量
awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。
ARGC 命令行参数个数 ARGV 命令行参数排列 ENVIRON 支持队列中系统环境变量的使用 FILENAME awk浏览的文件名 FNR 浏览文件的记录数 FS 设置输入域分隔符,等价于命令行 -F选项 NF 浏览记录的域的个数 NR 已读的记录数 OFS 输出域分隔符 ORS 输出记录分隔符 RS 控制记录分隔符
此外,$0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推。
统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:
#awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash filename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/bin/sh filename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/sh filename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/sh
使用printf替代print,可以让代码更加简洁,易读
awk -F ':' '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
print和printf
awk中同时提供了print和printf两种打印输出的函数。
其中print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。
printf函数,其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂。
循环语句
awk中的循环语句同样借鉴于C语言,支持while、do/while、for、break、continue,这些关键字的语义和C语言中的语义完全相同。
awk [-F field-separator] '/pattern/{command}' input-file(s)
mutian@mutian:~/test$ sed -n '/root/p' /etc/passwd #目前看来sed必须有执行的命令才行
root:x:0:0:root:/root:/bin/bash
mutian@mutian:~/test$ awk '/root/' /etc/passwd #默认操作就是搜索有指定字符串的行
root:x:0:0:root:/root:/bin/bash
mutian@mutian:~/test$ cat file 123;111;456 2 3 4;5;6 5 6;7;8 7 8 9 mutian@mutian:~/test$ awk -F ';' '((NF==3)&&($1>5)){print}' file 123;111;456 6;7;8
|
字符串函数 |
描述 |
|
length() |
返回字符串的长度 |
|
index() |
返回子字符串在另一个字符串中出现的位置 |
|
tolower() |
返回字符串并且将所有字符转换成小写 |
|
toupper() |
返回字符串并且将所有字符转换成大写 |
|
substr() |
返回从字符串中选择的子串 |
|
match() |
返回子字符串在另一个字符串中出现的位置。它与index()的区别在于它并不搜索子串,它搜索的是正则表达式。 |
|
sub() |
替换匹配的第一个字符序列,并返回整个字符串 |
|
gsub() |
替换匹配的全部字符序列,并返回整个字符串 |
|
split() |
分割字符串,并将各部分放到使用整数下标的数组中 |
length()返回字符串的长度,例子如下:
|
print length(mystring) |
index()返回子字符串在另一个字符串中出现的位置,如果没有找到该字符串则返回0,例子如下:
|
print index(mystring,"you") |
tolower()和toupper()返回字符串并且将所有字符分别转换成小写或大写。注意,tolower()和toupper()返回新的字符串,不会修改原来的字符串。例子如下:
|
print tolower(mystring) print toupper(mystring) |
使用substr()可以从字符串中选择子串。以下是substr()的调用方法:
|
mysub=substr(mystring,startpos,maxlen) |
以下是一个示例:
|
print substr(mystring,9,3) |
match()与index()非常相似,它与index()的区别在于它并不搜索子串,它搜索的是正则表达式。match()函数将返回匹配的起始位置,如果没有找到匹配,则返回0。此外,match()还将设置两个变量,叫作RSTART和RLENGTH。RSTART包含返回值(第一个匹配的位置),RLENGTH指定它占据的字符跨度(如果没有找到匹配,则返回-1)。通过使用RSTART、RLENGTH、substr()和一个小循环,可以轻松地遍历字符串中的每个匹配。以下是一个match()调用示例:
|
print match(mystring,/you/), RSTART, RLENGTH |
sub()和gsub()是两个字符串替换函数。sub()的调用方法如下:
|
sub(regexp,replstring,mystring) |
调用sub()时,它将在mystring中匹配regexp的第一个字符序列,并且用replstring替换该序列。gsub()与sub()的唯一的区别是sub()替换第一个regexp匹配(如果有的话),gsub()则执行全局替换,换出字符串中的所有匹配。举例如下:
|
sub(/o/,"O",mystring) print mystring mystring="How are you doing today?" gsub(/o/,"O",mystring) print mystring |
其输出结果如下:
|
HOw are you doing today? HOw are yOu dOing tOday? |
split()的功能是分割字符串,并将分割后的各部分放到使用整数下标的数组中。此函数有三个变量,第一个自变量为要分割的原始字符串,第二个自变量为分割后填入的数组名称,第三个变素为用于指示分割的分隔符。split()返回时,它将返回分割的字符串元素的数量。split()将分割的每一个部分赋值给下标从1开始的数组。举例如下:
|
numelements=split("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",mymonths,",") print mymonths[1],mymonths[numelements] |
其输出如下:
|
Jan Dec |
最后需要说明一点的是,调用length()、sub()或gsub()时,可以去掉最后一个变量,这样awk将对$0(整个当前行)应用函数调用。例如要打印文件中每一行的长度,使用以下awk脚本:
{
print length()
}
mutian@mutian:~/test$ cat file 123;111;456 2 3 4;5;6 5 6;7;8 7 8 9 mutian@mutian:~/test$ awk '{print index($0, 4)}' file 9 0 0 1 0 0 0 0 0 mutian@mutian:~/test$ awk '{sub("4","xy",$0);print $0}' file 123;111;xy56 2 3 xy;5;6 5 6;7;8 7 8 9 mutian@mutian:~/test$ cat x 123456789 abcdefghi ABCDEFGH1 mutian@mutian:~/test$ awk '{print substr($0,5,2)}' x 56 ef EF

浙公网安备 33010602011771号