1.算术计算
(()) 内建命令 , 允许只有等号的右边,或者 直接((j=$j+2)) 利用$(())取得计算结果
let 内建命令,表达式用" " 或者 表达式中间没有空格,不能只出现等号右边 ,不用$
expr 非内建命令,表达式必须有空格,利用$(expr $j + 2)取得计算结果 或者 直接 expr j = $j + 2,允许只有等号的右边
bc 浮点数计算工具
2. if 控制语句
不允许有类似c语言的 ;空语句
3. 打印输出
shell 没有print , 有printf ,相比c的printf,少了()和 逗号 ,
awk 可以使用printf ,相比c的printf,少了(),相比shell的printf 多了逗号
可以使用print ,完全是一个一个输出的堆积 awk ' {printf "nr=",NR,"fnr=",FNR ; print $0 } '
shell还有echo 可以打印输出,相比printf完全不用在意data的类型。
4.awk
close 仅针对I/O重定向运算符所打开的文件或管道,还有getline print printf。
输出重定向 awk ‘ print $0 > "filename" ’ file_input 重定向的目标文件名必须用双引号引用起来
awk ' print $0 >> "filename" ' file_input
管道
awk中使用管道有两种语法,分别是:
awk output | shell input
shell output | awk input
如果在awk程序中打开了管道,必须先关闭该管道才能打开另一个管道。也就是说一次只能打开一个管道。shell命令必的管道必须被双引号引用起来。
“如果打算再次在awk程序中使用某个文件或管道进行读写,则可能要先关闭程序,因为其中的管道会保持打开状态直至脚本运行结束。
注意,管道一旦被打开,就会保持打开状态直至awk退出。因此END块中的语句也会收到管道的影响。(可以在END的第一行关闭管道)”
对于awk output | shell input来说, awk的output是先缓存在pipe中,等输出完毕后再调用shell命令 处理,shell命令只处理一次,而且处理的时机是“awk程序结束时,或者管
道关闭时(需要显式的关闭管道)”
$awk '/west/{count++} {printf "%s %s\t\t%-15s\n", $3,$4,$1 | "sort +1"} END{close "sort +1"; printf "The number of sales
pers in the western"; printf "region is " count "." }'
datafile
对于 shell output | awk input来说,awk的input只能是getline函数。shell执行的结果缓存于pipe中,再传送给awk处理,如果有多行数据,awk的getline命令可能调用多次。
$awk 'BEGIN{ while(("ls" | getline d) > 0) print d}' file
4.1 awk
awk如果没有输入文件,会挂起:
ip3=$(awk '{print var}' var="$ip_b_addr" file_name) 如果没有file_name , awk会挂起整个程序
4.2 awk 的变量
awk中,只有$1 $2 .. 需要加 $ 号
awk定义的 变量 不需要加$号,print 、计算都不需要加 ;
awk引用主进程的变量需要加 $, 直接print 还需要" ' ' "
4.3 awk的正则表达式
awk采用扩展的正则表达式
5. 变量替换
${var#pattern} ${var##pattern}
${var%pattern} ${var%%pattern}
${var/#pattern/REPLACEMENT} ${var/%pattern/REPLACEMENT} (1) 开头、结尾匹配才起作用
(2)pattern 可以是正则表达式,不需要用/ /括起来,直接写就可以
(3)但是REPLACEMENT 必须是具体的,不能是正则表达式。
(4) 所以,变量替换 对某一行删除某个字符可能不好用
6. $# $NF
位置变量的个数 $#
awk 列的个数 $NF
7. sed awk 输出重定向
7.1 输出 重定向
sed ‘/.../.../w file_outpu’ file_input # 覆盖原来file_output的内容
sed '../../ ' file_input >file_output
sed ' /../ ../ ' file_input >> file_output # 注意 sed -n ‘ / ../ ../ ’ file > file_output # file_ouput 不会有内容,因为sed 是-n silent
awk '{print $0 > file_output}' file_input
awk '{print $0 >> file_output}' file_input
7.2 默认输出
sed 默认输出到tty
awk默认不输出
7.3不输出
sed -n '/..../' file
7.4 只输出某些行
sed -n ‘/..../..../p’ file
awk ‘//{print $0}’ file