unix脚本总结与应用实例 - 图文(8)

2019-03-22 14:56

19027008.doc Confidentiality level 密级

16.awk的sprintf函数的使用

17.awk的重定向,输出到文件:

19.awk删除输入行中特定行的换行字符

例如:删除奇数行的换行字符 awk ' {

if (NR % 2 == 1)

printf \else

print $0

}'

18.awk删除文件的第一行 awk ?{ if (NR % 2 == 1) printf ―%s‖, $0 ‘

可以使用>或者>>

print \

sprintf格式化字符串

print sprintf(\

20.awk获取输入行中,域的最大个数

awk '{if (NF > max) max = NF} END {print max}'

21.awk输出一行超过80 个字符的每一行

awk 'length($0) > 80'

22.awk输出至少一个域的所有行。可用来将一个文档里的所有空白行删除

awk '{if (NF > 0) print}'

23.awk输出范围在0 到100 之间的7 个随机数

awk 'BEGIN {for (i = 1; i <= 7; i++)

print int(101 * rand())}'

24.awk将所有用户的login名称依照字母的顺序输出

awk 'BEGIN {FS = \

25.awk将一个文档的总行数输出

awk '{nlines++} END {print nlines}'

或awk 'END {print NR}'

26.awk输出文档的内容时会在每行的最前面输出行号它的功能与'cat -n' 类似

All rights reserved 版权所有,侵权必究

Page 36 , Total 83 第36页,共83页

19027008.doc Confidentiality level 密级

awk '{print NR,$0}'

27.awk自定义函数的例子一: 第一个域与第二个域的平方和

awk ?{print \

function SquareSum(x,y) { sum=x*x+y*y return sum }‘

28.awk的split、数组、注释

test.awk 文件:

#!/bin/awk -f BEGIN {

record=\

num=split(record,myarray,\} END{

for(i=1;i<=num;i++) {

print myarray[i] # print the element of array }

}

调用:

./test.awk /dev/null 输出: 123 456 789

str是字符串,num定义了要打印的域的序号。 str=‖abc bcd cde efg‖ num=2

29.awk打印传入字符串的第n个分隔域。

echo \打印出: bcd

注:k的值是$1+1而不是$1,因为$num也要算awk的传入参数。

30.在awk中使用shell中的变量

str1=\str2=\

echo \if(\\$2==\\\

print(\\\

All rights reserved 版权所有,侵权必究

Page 37 , Total 83 第37页,共83页

19027008.doc Confidentiality level 密级

}'\

打印

hello world

另一种方法就是把shell中的变量当参数通过管道传入到awk中。

需求:

已知变量 usr的值为 sms, 要求使用 awk 在 /etc/passwd文件中查找(以:为分隔符号), 当匹配到第一个域(name)时,打印第6个域(home).

所需表达式:

awk –F: ?{ if($1==‖sms‖) print $6 }‘ /etc/passwd

#!/bin/ksh #set -x usr=\

# 方法一,使用临时文件 tmp.txt

eval \/etc/passwd >tmp.txt\cat tmp.txt

# 方法二,完全使用eval合成 par1='\\$1' par6='\\$6' equal='\\\eval \awk -F: '{ if ( $par1==$equal$usr$equal ) print $par6 }' /etc/passwd \\\#echo \home=`eval \echo $home

注:

(1) eval 按照双引号进行展开, 每一对双引号展开一次, 我们例子中的句子: eval \awk -F: '{ if ( $par1==$equal$usr$equal ) print $par6 }' /etc/passwd \\\

awk中引用的变量被两对双引号包括,所以要构造出所需表达式,需要保证$1和‖能将禁得起两次展开:

二次展开定义式:

par1=‘\\$1‘ # 单引号 在两次展开以后就变成了$1 二次展开定义式:

equal=‘\\‖‘ # 单引号

All rights reserved 版权所有,侵权必究

Page 38 , Total 83 第38页,共83页

19027008.doc Confidentiality level 密级

在两次展开以后就变成了‖

由于希望$usr在两次展开之后变成 sms, 所以不需要二次展开定义式,如下定义式:

usr=\

在两次展开以后就变成了sms

(2) 当合成cmd以后, 会发现cmd已经合成为:

cmd: awk -F: '{ if ( $1==\但是不能调用 home=`$cmd`

来获取其输出值 ,而只能使用 home=`eval \

方法三(推荐用法): 使用 awk –v参数. awk –F: -v usr=\?{ if ($1==usr) rint $6 }‘ /etc/passwd 注:如果有多个参数需要共享,可以使用多个-v参数传入.

其它实现的方法:

# 方法四: 查找以 $usr: 开头的行,打印第6个元素

home=`cat /etc/passwd | grep \$6 }'`

echo $home

# 方法五: 重新组织行,将要查找的字符串放到首位,各个字符串以空格分隔, 然后查找以 $usr 开头的行,打印相应元素.

# 此方法适用于不以要查找的字符串为开头的行, 重新组织以后,就可以使用方法四.

home=`cat /etc/passwd | awk -F: '{ printf(\%s\\n\}' | grep \| awk '{print $2 }' ` echo $home

31.在某个目录下查找包含特定字符串的文件。返回文件名称

dir=\find_str=\

grep -c \'BEGIN{FS=\

返回找到文件的列表,每行一个文件。

五.其它命令

1.eval命令:可用于动态生成和执行代码

Page 39 , Total 83 第39页,共83页

All rights reserved 版权所有,侵权必究

19027008.doc Confidentiality level 密级

foo=10 x=foo eval

y=‘$‘$x

echo $y

输入10,即eval y=‘$‘$x被解释为y=$foo,即y=10。 nDay1=\nDay2=\nDay3=\

# 遍历变量nDay1 ...nDay3,打印其值 for i in 1 2 3 do n=$i

eval nVar='$nDay'$i echo $nVar done

应该依次输出 $nDay1 , $nDay2, $nDay3 ,即: 111 222 333

另一个用于数组的例子, #!/bin/ksh

nDay_1[0]=\nDay_2[0]=\nDay_3[0]=\ k=2

for i in 1 2 3 do

eval \ echo ${nVar} done

# 打印

# 赋值, 型如:nDay_x[n]=$i

eval \# 访问, 型如:nVar=${nDay_x[n]}

应该依次输出 ${nDay_1[2]}, ${nDay_2[2]}, ${nDay_3[2]}, 即: 1 2 3

2.exit n:退出

0代表成功,1-125代表出错代码,128以上引发一个信号。

我们脚本或许会和别的脚本交互,这个时候需要相互传递信息,exit是被调用进程的

Page 40 , Total 83 第40页,共83页

返回值,调用进程使用$?获得返回值。

All rights reserved 版权所有,侵权必究


unix脚本总结与应用实例 - 图文(8).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:18万吨粉状磷酸一铵项目可行性研究报告

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: