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 版权所有,侵权必究
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库unix脚本总结与应用实例 - 图文(8)在线全文阅读。
相关推荐: