命令格式:
awk 选项 'BEGIN{}pattern{commands}END{}' file file1 file2....
1、BEGIN{}:正式处理数据之前执行
2、pattern:匹配模式 (可省略)
3、{commands}: 处理命令,可能多行 用分号隔开(类似于 sed -i '/^#/d;/^$/d' my.cnf.bak 删除以#开头的行和空行)
4、END{} :处理完所有匹配数据后执行
2、3步骤:每行依次执行该步骤
内置变量:
$0
awk '{print $0}END{}' passwd 输出passwd文件的每行数据
$1-$n
NF(number field) 该行的字段的个数
awk 'BEGIN{FS=":"}{print NF}' passwd 以:为分隔符,输出每行的字段数
NR
FNR
FS(field separator) 行内的分隔符(默认值为空格 ,不管有多少个空格都是默认,或者tab键 都可以)
awk 'BEGIN{FS=":"}{print $1}' passwd 输出passwd文件里每行以:为分隔符的第一列的内容
RS
awk 'BEGIN{FS=":";RS="|||||"}{print $1}' passwd
OFS
ORS
awk 'BEGIN{ORS="&";FS=":"}{print $1}' passwd 在输出列表中用&连接输出内容用以代替默认的行分割符
awk 'BEGIN{ORS="&";FS=":";OFS=":"}{print $1,$2}' passwd 在输出多个列时,用OFS连接列与列,用&连接行与行,类似于aaa:bbbb&ccc:ddd
pattern:两种模式
1、RegExp
awk 'BEGIN{FS=":"}/sbin/{print $0}' passwd 输出passwd中所有包含sbin的行
awk 'BEGIN{FS=":"}/^root/{print $0}' passwd 输出passwd中所有以root开头的行
2、运算符匹配
关系运算符:
<(<= ) 小于(小于等于)
>(>=) 大于(大于等于)
== (!=) 等于(不等于)
~ 匹配正则
!~ 不匹配正则
awk 'BEGIN{FS=":"}$3<100{print $0}' passwd 输出以:为分隔符 第3个字段小于100的所有行
awk 'BEGIN{FS=":"}$3~/[0-9]{3,}/{print $0}' passwd 输出以:为分隔符 第3个字段包含的数字大与等于3位的所有行
布尔运算符:
|| 或
&&与
! 非
awk 'BEGIN{FS=":"}$1=="meng"||$1=="tss"{print $0}' passwd
算数运算符:
+ 、-、*、/(可以得到小数,并非像高级语言的整数值)、%(取模)、^或**(乘方)、++x、x++、--x、x--
awk 'BEGIN{a=10;b=11;print a,b}' 输出10 11
commands:
printf:
%s以字符串输出 awk ‘BEGIN{FS=":"}{printf "%s\n",$1}’ file 以:为分隔符 输出每一行的第一个字段并用\n换行
awk ‘BEGIN{FS=":"}{printf "%-20s\n%+10s",$1,$2}’ file 以:为分隔符 输出每一行的第一个字段并用\n换行,并且第一个字段占20个字符左对齐(-),第二个字段占 10个字符右对齐(+) (当添加字符长度的默认为右对齐)
%d 以十进制输出
%f 以浮点数输出 (%0.2f 小数点之后保存2位)
%x 以十六进制输出 (%#x 在输出前面加上0x 以标识16进制)
%o 以八进制输出(%#x 在输出前面加上0 以标识8进制)
条件语句:
BEGIN{
FS=":"
}{
if($3<50){
printf "%-20s%-20s%-5d\n","小于50的",$1,$3
}
else if($3>50 && $3<100){
printf "%-20s%-20s%-5d\n","大于50的小于100的",$1,$3
}
else {
printf "%-20s%-20s%-5d\n","大于50的",$1,$3
}
}
awk -f file passwd 把模式写入到file文件中循环语句:
while循环
BEGIN{
while(i<=100){
sum+=i
i++
}
print sum
}for循环
BEGIN{
for(i=0;i<=100;i++){
sum+=i
}
print sum
}
do-while循环BEGIN{
do{
sum+=i
i++ }while(i<=100)
print sum
}
选项:
-v 参数传递(定义或引用变量)
-f 指定脚本文件 awk -f file passwd 把模式写入到file文件中
-F 指定分隔符 awk -F ":" "{print $1}"
-V 查看awk的版本号
数组的用法:
shell中的用法:在shell命令行中:
array=('"111" "222" "333") 下标从0开始 注意:不是以逗号分割,而是以空格分割
打印所有元素 echo ${array[@]}
打印元素: echo ${array[2]}
打印元素个数:echo ${#array[@]}
打印数组中某个元素的长度 echo ${#array[2]}
给元素赋值 array[2]="444"
删除某个元素 unset array[2] 删除所有元素 unset array 删除数组元素并不会对索引进行重新排序
分片访问:echo ${array[@]:1:3} 从下标为1的元素 往后取3个元素 包括1下标
元素替换:${array[@]/a/b} 把数组中每个元素中第一个a替换成b ${array[@]//a/b} 全部替换
遍历:
for a in array
do
echo $a
done
mysql命令参数:
-u 用户名
-p 密码
-h 服务器ip地址
-D 数据库名
-N 不输出列信息
-B 使用tab代替默认交互分隔符
-e 执行sql语句
-E 垂直输出
-H 以html格式输出
-X 以xml格式输出