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()还将设置两个变量,叫作RSTARTRLENGTHRSTART包含返回值(第一个匹配的位置),RLENGTH指定它占据的字符跨度(如果没有找到匹配,则返回-1)。通过使用RSTARTRLENGTHsubstr()和一个小循环,可以轻松地遍历字符串中的每个匹配。以下是一个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

 



posted @ 2016-01-08 16:33  牧 天  阅读(334)  评论(0)    收藏  举报