【grep】
grep 'root' file 【搜索root关键字所在的行】
grep -c 'root' file 【搜索root关键字出现的总共的行数】
grep -n --color 'root' file 【搜索root关键字所在的行并显示行号,且关键字root标记颜色】【centos7默认对grep已经增加了--color的别名属性】
grep -v 'root' file 【取反,搜索不是关键字root所在的行】
grep -A2 'root' file 【A表示after,搜索root关键字所在的行并显示其下文的2行】
grep -B2 'root' file 【B表示before,搜索root关键字所在的行并显示其上文的2行】
grep -C2 'root' file 【C表示front,搜索root关键字所在的行并显示其上文和下文的2行】
grep -r 'root' 【r表示recursive{遍历}把目录下的所有文件全部遍历一遍搜索关键字root所在的行】
grep -n '[0-9]' 2.txt 【搜索出所有带数字的行并显示行号】
grep -nv '[0-9]' 2.txt 【搜索出所有不带数字的行并显示行号】
grep -n '^[^0-9]' 2.txt 【搜索出不是数字开头的行并显示行号;[^0-9] 表示非数字;[^a-z]表示非 小写字母等】
grep -n 'o$' 2.txt 【搜索出以o结尾的行并显示行号】
grep -i 'root' file 【i表示ignore,搜索忽略root大小写的行】
grep -o 'root' file 【o表示只显示匹配到内容如:root,除了root这个单词外其它信息都不打印】
grep -l 'root' * 【列出文件内容符合指定的范本样式的文件名称】
grep -L 'root' * 【列出文件内容不符合指定的范本样式的文件名称】
grep -P
-P表示启用perl正则
grep -P '123\*test.txt' file 【匹配file文件中 '123*test.txt'所在行】
file.txt内容为:
aaa123
aaa456
bbb789
查询字符 a 在文件file中出现的次数
cat file | greop -o 'a' | wc -l 【结果:6】
\< 和 \> 分别标注单词的开始与结尾。
例如:
grep man * 【匹配 ‘Batman'、‘manic'、‘man'等】
grep '\<man' * 【匹配‘manic'和‘man',但不匹配‘Batman'】
grep '\<man\>' 【只匹配‘man',而不是‘Batman'或‘manic'等其他的字符串【用于精确匹配】
-q 参数: 【用于if逻辑判断】
grep -q 'aaa' file 【安静模式,不打印任何标准输出。如果有匹配的内容则立即返回状态值0】
举例:
if grep -q 'aaa' file;then command; fi
AB.C 【B字符后面任意一个字符;grep 'AB.C' file】
AB*C 【0个或多个B字符;grep 'AB*C' file】
AB+C 【1个或多个B字符,要用-E扩展;grep -E 'AB+C' file】
AB?C 【0个或1个B字符,要用-E扩展;grep -E 'AB?C' file】
AB.*C 【 .*任意的字符,贪婪匹配;grep 'AB.*C' file】
【注:* 在通配符中表示任意的无限的字符;* 在正则表达式中表示0到多个前一个RE字符】
grep -E 'root|mysql' file 【-E可接正则,搜索关键字root或者mysql的行;等于》egrep 'root|mysql' file】
grep -E '(oo)+' file 【搜索带双oo的一个或多个的行】
grep -E '(oo){2}' file 【{2}表示大于2的次数,即搜索带双oo的超过2次数的行;如结果:roooooooot】
grep -E '(oo){2,4}' file
【Sed】
【查找替换功能,不会真正的操作源数据文件,除非-i 参数带上】
-n 【只打印匹配出来的行】
-r 【支持扩展的正则表达式】
p 【表示打印print】
-d 【delete删除指定的行】
p:打印 通常和-n参数一起使用:
cat file | sed -n '1p' 【打印第一行】
cat file | sed -n '$p' 【打印最后一行】
cat file | sed -n '1,3p' 【打印第1到第3行】
grep -n '.*' 2.txt|sed -nr '/ro?t/p' 【同grep一样可以使用扩展的正则表达式匹配,但要加参数-r】
grep -n '.*' 2.txt|sed -nr '/ro?t|mysql/p' 【同grep一样可以使用扩展的正则表达式匹配,但要加参数-r】
grep -n '.*' 2.txt|sed -nr '/(oo)+t|mysql/p' 【同grep一样可以使用扩展的正则表达式匹配,但要加参数-r】
grep -n '.*' 2.txt|sed -n -e '/test/p' -e '/mysql/p'【等同于:grep -n '.*' 2.txt|sed -n '/test/p ; /mysql/p' 用分号隔开两个表达式合成一个表达式可去掉-e参数】
结果:
1:test,mysql
1:test,mysql
2:mysql
因为第一行中即包含test关键字,有包含mysql关键字,sed匹配是一行一行的匹配,先执行第一个表达式/test/p;
然后再从第一行执行第二个表达式/mysql/p;-e参数就是用来可以同时执行多个表达式】
cat /etc/hosts | sed -n '1,/smstest5/p' 【打印第1行到匹配到'smstest5'此行】
cat /etc/hosts | sed -n '/BBB/,/CCC/p' 【打印匹配'BBB'此行到匹配到'CCC'此行】
cat file1|sed '1,2w file2'
将file1的内容的第1行和第2行写入到file2中
cat file1|sed '2r file2'
读取file1并在file1的第2行后面显示读取的file2的内容
sed -rn '/ro[o|t]t/p' file 【[o|t]表示 o | t 三选一去匹配符合的行】
sed '1,5d' file 【删除1到5行后打印数据从第6行开始】
sed '10,$d' file 【删除第10行到最后一行的数据】
sed -r '/test|mysql/d' file 【删除包含test的行或者包含mysql的行】
sed -r '/[0-9]/d' file 【删除包含数字的所有行】
sed -r '/[^0-9]/d' file 【删除以数字开头的行】
sed -r '/^#/d' file 【删除以#号开头的行】
参数:
a 【na(n表示整数)在指定的n行的下一行新增】
i 【ni(n表示整数)在指定的n行的上一行新增】
c 【nc(n表示整数)在指定的n行上替换】
w 【nw(n表示整数)将file指定的n行内容写进另一个文件file2】
举例:
sed '1a AAA' file 【在第一行的下一行新增AAA内容;'1a AAA' 可以写成'1a\AAA';空格替换成反斜线】
sed '/^mysq/a\AAA' file 【在以mysql开头的此行的下一行新增AAA内容,反斜线也可以改成空格;'/^mysq/a\AAA' =》'/^mysq/a AAA' 】
sed '2i AAA' file 【在第二行的上一行新增AAA内容;'2i AAA' 可以写成'2i\AAA';空格替换成反斜线】
sed '/^mysql/i\AAA' 【在以mysql开头的此行的上一行新增AAA内容】
sed '2c AAA' file 【在第二行上将其替换成AAA;'2c AAA'可以写成'2c\AAA';空格替换成反斜线】
sed '/^mysql/2\AAA' file 【在以mysql开头的此行,将其替换成AAA内容】
cat -n file1 | sed '2w file2' 【将file1的第2行内容写入file2中;注意:cat -n file1带了参数-n加上了行号,写入到file2时自动将此行号也写入到了文件file2中】
【替换】:
sed 's/root/test/g' 【替换每行中root变成test】
grep -n '.*' 2.txt | sed 's/[0-9]//g' 【替换每行中数字变成空,即删除每行的数字】
grep -n '.*' 2.txt | sed 's/[^0-9]//g' 【替换每行中非数字的变成空,即删除每行中的非数字】
grep -n '.*' 2.txt|sed -r '5,10{s/[0-9]//g}' 【删除第5行到第10行里的数字】
grep -n '.*' 2.txt|sed -r 's/[^0-9][^a-zA-Z]//g' 【删除所有行里的特殊字符除了数字和大小写字母】
head 2.txt | sed -r 's/(.*:)([0-9]*)(:.*:)([^:]+$)/\1\4\3\2/g'【每行里出现的第一个数字和最后一个单词值互换位置】
head 2.txt|sed -r 's/(.*:)([0-9]+)(:.*:)([^:]+$)/\1\3\4\2/g' 【每行里出现的第一个数字移动到行尾】
结果如:adm:x:3::adm:/var/adm:/sbin/nologin4 【原来是:adm:x:3:4:adm:/var/adm:/sbin/nologin】
head 2.txt | sed -r '1,5{s/^/aaa:&/g}' 【在第一行到第五行的最前面添加上aaa: 】
head 2.txt | sed -r '1,5{s/$/&aaa:/g}' 【在第一行到第五行的最末尾添加上aaa: 】
^ 代表行首,$ 代表行尾
aaa:& &表示后面的所有的字符;
&aaa: &表示前面的所有的字符;
【N选项】
file文件内容:
111
222
333
cat file | sed 'N;s/\n//' N表示当前行(即第一行)的下一行追加到当前行后面,s/\n// {或者s/\n//g} 表示换行替换为空
111222
333
cat file | sed 'N;s/\n/ /' N表示当前行(即第一行)的下一行追加到当前行后面,s/\n/ / {或者s/\n/ /g}表示换行替换为空格
111 222
333
cat file | sed '2N;s/\n//' 2N表示当前行(即第二行)的下一行追加到当前行后面,s/\n// {或者s/\n//g} 表示换行替换为空
111
222333
cat file | sed '2N;s/\n/ /' 2N表示当前行(即第二行)的下一行追加到当前行后面,s/\n/ /{或者s/\n/ /g} 表示换行替换为空格
111
222 333
【将第一个冒号前的值和最后一个冒号后的值相互替换】
sed -r 's/([^:]+)(:.*:)([^:]+$)/\3\2\1/g' file 等同于> sed -r 's/([^:]+)(:.*:)([^:]+)/\3\2\1/g' file
[^:]+ 【表示非冒号(:)开头的字符,(+)号表示有1个或多个】
:.*: 【表示第一个冒号到最后一个冒号之间的内容】
[^:]+$ 【表示最后一个冒号后面的内容,非冒号: 开头的字符,+号表示有1个或多个一直到最后一个$ 【或者去掉$写成 [^:]+】
sed表达式中:【\1表示第一段;\2表示第二段;\3表示第三段】
sed命令替换:
加上-i选项,才会真正修改源文件,
sed -i 's%abc%123%g' filename 【这里斜线也可以使用%代替】
sed -i 's/AA/BB/g' file 【斜线可以用#号代替:sed -i 's#AA#BB#g' file】
sed -n "$num1,$num2"p file 【当sed表达式中含有变量需要替换时,改用双引号括起,因为单引号不会替换变量】
sed -i -r "s#\/home\/hudechao#$APP_HOME#g" file【当有特殊字符转义时,且有变量需要替换时,sed的表达式斜线替换为#号,且表达式用双引号括起】
sed -i "s#contractId: '5'#contractId: '7'#g" filename
【awk】
awk -F ':' '{print $7}' /etc/passwd 【-F':'以冒号:作为分隔符切分,{print $7}输出打印分隔后的第7段字符】
一、语法:
awk [-F/-f/-v] 'BEGIN {} / exp / {command1;command2} END {}' file
参数:[-F/-f/-v]
-F 指定分隔符
-f 调用脚本
-v 定义变量(var=name)
BEGIN 初始化命令代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置分隔符
{ } 命令代码块,包含一条或多条命令,多条命令之间使用 ; 分号分隔
END 结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
/exp/ 两个斜线之间是一个表达式【指以此表达式进行过滤的】
表达式包括:正则表达式、条件表达式、字符表达式、数值表达式、综合表达式、逻辑表达式
二、举例:
1、
cat /etc/passwd | awk -F ':' '/root/{print $1,$2}' 【以冒号分隔,匹配含有root字符的行,输出打印第一个、第二个参数】
cat /etc/passwd | awk -F ':' '/^root/{print $1,$2}' 【以冒号分隔,匹配以root字符开头的行,输出打印第一个、第二个参数】
cat /etc/passwd | awk -f aa_awk.sh 【调用外部脚本aa_awk.sh处理文件/etc/passwd】
cat /etc/passwd | awk 'BEGIN {FS":"} /root/ {print $1} END {print "END"}'
2、
cat /etc/passwd | awk -F':' 'NR==1,NR==2{print "name:",$1,"shell:",$7}'【{ }花括号里面的自定义的变量需要双引号括起来,因为本身{}花括号是在单引号' '里面的】
name: root shell: /bin/bash
name: bin shell: /sbin/nologin
3、
-F '[: # /]' 【指定分隔符可以是个字符集,同时可以以:# / 进行分隔】
4、
awk -v a="hello" '{print a}' /etc/passwd 【相当于将passwd的每一行都替换成hello】
hello
hello
hello
awk -v FS=':' '{print $1,$7}' /etc/passwd 【还可以将FS和OFS作为变量来使用,此时要有=等号的形式】
awk -v FS=':' -v OFS='-' '{print $1,$7}' /etc/passwd
5、awk的内部变量(预定义变量)
NR 已读的记录数【指:处理文件的前几行;NR==1,NR==5表示只处理文件的1到5行】
cat /etc/passwd | awk -F: 'NR==1,NR==5{print $1}' 【NR和{print}用引号引在一起时可以有空格也可去掉空格】
cat /etc/passwd | awk -F: 'NR==$num1,NR==$num2''{print $1}' 【当NR==$num变量时,需要用双引号括起,因为单引号不替换变量】
cat /etc/passwd | awk -F: "NR==$num1,NR==$num2"'{print $1}' 【NR和{print}分开用引号引起时之间不能有空格】
或cat /etc/passwd | awk -F: "NR==$num1,NR==$num2{print $1}"
FNR 浏览文件的记录数(以文件为单位计数)
FS 设置输入域分隔符等价-F
OFS 设置输出域分隔符,即输出时以什么字符间隔(默认是空格)
cat /etc/passwd | awk 'BEGIN{FS=":";OFS="-"} {print $0}' 《=》cat /etc/passwd | awk 'BEGIN{FS":";OFS"-"} {print $0}'
cat /etc/passwd | awk 'BEGIN{FS=":";OFS="-"} {print $_}' 《=》cat /etc/passwd | awk 'BEGIN{FS":";OFS"-"} {print $_}'
【这里print $0和print $_ 都表示输出整行;FS和OFS用法同-F相似】
NF 分隔后的字符数量
$NF 因为$NF是个数值,而且是分隔符划分后的字符总个数,当{print $NF}就表示打印最后一个位置的字符了
cat /etc/passwd | awk 'BEGIN{FS=":";OFS="-"} {print NR,$1,NF,$NF}'
1-root-7-/bin/bash
2-bin-7-/sbin/nologin
3-daemon-7-/sbin/nologin
RS 记录输入分隔符【默认值是换行\n】
ORS 记录输出分隔符【默认值是换行\n】
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
cat /etc/passwd | awk '/^root/{print $0}'
结果:root:x:0:0:/bin/bash
$0代表的是逐行
/^root/是正则表达式,将满足条件的行送入到{print $0}中处理
6、格式化输出
方法1: 采用OFS, 设置OFS="\t\t"
方法2: 采用printf格式化打印
%-10s: 表示左对齐总共长度10个字符,不足用空格补齐
%10s: 表示右对齐总共长度10个字符,不足用空格补齐
如:
awk -F: 'BEGIN{printf "%-10s %-5s %-20s %-10s\n","username","uid","dir","shell"} NR==1,NR==3 {printf "%-10s %-5s %-20s %-10s\n",$1,$3,$6,$7}' /etc/passwd
结果:
username uid dir shell
root 0 /root /bin/bash
bin 1 /bin /sbin/nologin
daemon 2 /sbin /sbin/nologin
7、条件表达式:
~ 【模糊匹配$1~"mail"】
!~ 【模糊不匹配】
== 【精确匹配 $1=="mail"】
!== 【精确不匹配】
> 【大于 $3>500】
< 【小于】
显示/etc/passwd中uid大于500(普通用户)
awk -F: '$3>500 {print}' /etc/passwd
显示/etc/passwd中uid等于0(超级用户)
awk -F: '$3==0 {print}' /etc/passwd
模糊匹配/etc/passwd中uid值含有0(普通用户)
awk -F: '$3~0 {print}' /etc/passwd
模糊匹配shell中含有bash的:
awk -F: '$NF~"bash" {print}' /etc/passwd
8、综合表达式:&&(与)、||(或)
显示用户名包含有root且uid模糊匹配值中含有0
awk -F: '$1~/root/ && $3~0 {print}' /etc/passwd
显示uid大于等于300,小于等于600(普通用户)
awk -F: '$3>=300,$3<=600 {print}' /etc/passwd
9、awk的流程控制
if语句:
{if($3>500) {print} else {print}}【if语句必须用在{}花括号中,且判断的条件语句必须在()内】
举例:
uid大于500显示larger,uid小于500显示small
awk -F: '{if($3>500) {print NR ,"larger"} else {print NR, "small"}}' /etc/passwd
while语句:
{while(条件) {while的循环体} print "循环后的值"}
举例:
从1加到100求和
awk 'BEGIN {sum=0;i=1;while(i<=100) {sum=sum+i;i++} print sum}' 【print sum 这个sum不能带双引号,否则就直接打印sum这个字符了】
10、awk的函数:
echo abcdef | gawk '{print $1,substr($1,2,2)}'
结果:
abcdef bc
【substr($1,2,2)表示abcdef作为传入的值,取第2个字符开始长度为2】
【如:substr($1,2,3) 取第2个字符开始长度为3结果为:bcde】
echo abcdef | gawk '{print $1,toupper($1)}'
结果:
abcdef ABCDEF 【toupper($1),将$1转换成大写字母】
echo ABCDEF | gawk '{print $1,tolower($1)}'
结果:
ABCDEF abcdef 【tolower($1),将$1转换成小写字母】
echo abcd | gawk '{print $1,length($1)}'
结果:
abcd 4 【length($1)字$1的字符长度】
sub(pattern, str1, string)
用str1替换string中满足pattern的正则的字符串结果
awk 'BEGIN{info="test2019test!";sub(/[0-9]+/, "!", info);print info}'
结果:test!test! {将info中数字匹配的结果一个或多个全部替换为叹号!}
11、awk的循环(for、while、do)
@for 循环:
for(变量 in 数组) {语句}
awk 'BEGIN {for(k in ENVIRON) {print k "=" ENVIRON[k];}}'
for(变量;条件;表达式) {语句}
awk 'BEGIN {total=0;for(i=0;i<=100;i++) {total+=i} {print total}}' ==>awk 'BEGIN {total=0;for(i=0;i<=100;i++) {total+=i;} {print total;}}'【也可以加上分号】
@while循环:
while(表达式) {语句}
awk 'BEGIN {i=0;total=0;while(i<=100) {total+=i;i++} {print total}}'
@do循环:
do{语句} while(条件)
awk 'BEGIN {total=0;i=0;do{total+=i;i++} while(i<=100) {print total}}'
12、awk运算符介绍(部分的):
in运算符:
判断数组中是否存在该值如B[i] 判断i的值
awk 'BEGIN {a="b";arr[0]="b";arr[1]="c";print (a in arr)}'
结果:0 【表示为真】
awk 'BEGIN {a="b";arr[0]="e";arr["b"]="c";print (a in arr)}'
结果:1 【表示为假】
? : 问号和冒号
awk 'BEGIN{a=13;print a==13?"ok":"err";}'
结果:ok {判断如果a等于13输出ok,否则输出err}
ls -l /root | grep -E '^-' | awk '{x+=$5};END {print "total size is :"x"b"}'
查看/root目录的文件夹的总大小,这里的END就起到当前面的求和执行完成之后再执行后面的print
结果:total size is :3236b
13、
(1)、awk字符串转数字:
awk 'BEGIN{a="100";b="2test10";print(a+b+0)}'
结果:102
awk 'BEGIN{a="100";b="test10";print(a+b+0)}'
结果:100
只需要将变量通过 + 连接运算,自动强制将字符串转为整型,非数字变为0,发现第一个非数字字符后面的自动忽略
(2)、awk字符串连接
awk 'BEGIN{a="a";b="b";print(a""b)}'
结果:ab
awk 'BEGIN{a="a";b="b";print(a+b)}'
结果:0 {因为通过+号连接时非数字的第一个字符自动变成0,且第一个字符后面的自动省略}
(3)、awk数字转字符串
awk 'BEGIN{a=100;b=100;print(a""b)}'
结果:100100
14、awk过滤搜索出行后可以进行排序
cat file | awk -F '=' '{print $1"="$2}' | sort
接续awk各运算符
awk运算符
1、赋值运算符
=,+=,-=,*=,/=,%=,^=,**=
2、逻辑运算符
|| 或运算
&& 与运算
举例:
awk 'BEGIN {a=1;b=2;print(a>5&&b<=2),(a>5||b<=2);}'
0,1
3、关系运算符
<,<=,>,>=,!=,==
举例:
awk 'BEGIN{a=1;b=2;if(a<b);{print "OK"}}'
ok
4、算术运算符
+,-,*,/,&(求余数),!(逻辑非),^ ***(求幂),++(加加),--(减减),$(字段引用),空格(字符串连接符),
?: (c语言条件表达式),in(数组中是否存在某键值key的值不是value)
举例:
说明:所有用作算术运算符进行操作,操作数自动转为数值,所有非数值都将变为0进行运算
awk 'BEGIN{a="b";{print a++,++a}}' 【++如果是后缀,先将执行其它的运算操作,最后再自增1;++如果是前缀,先对a自增1,再执行其它的运算操作】
0,2
awk 'BEGIN{a="b";{print ++a,a++}}'
1,1
awk 'BEGIN{a="b";{print a=="b" ? "ok" : "err"}}'
ok
awk 'BEGIN{a="b";arr[0]="b";arr[1]="c";{print a in arr}}'
0[判断数组arr的键值有没有等于a的,显然是没有;print 0 in arr 结果才是1]
awk 'BEGIN{a="b";arr[0]="b";arr["b"]="c";{print a in arr}}'
1[显然arr数组的键值是有"b"的]
5、正则运算符
~ 包含某字符
!~或~! 不包含某字符
举例:
awk 'BEGIN{a="100ab";if(a~/^100*/);{print "ok"}}'
结果:ok
awk的正则表达式都写在/regular/双斜线里
+ /a+b/ 匹配一个或多个a字符
? /a?b/ 匹配一个或零个a字符
| /str1|str2/ 匹配包含字符串str1的或包含字符串str2的
() /roo(ta)/ 匹配和括号组合在一起的:roota
{m} /abc{2}/ 正好匹配有2个abc包含在字符串中:abcabc
{m,} /abc{2,}/ 至少有2个abc包含在字符串中
{m,n} /abc{1,2}/ 表示有1个或2个abc包含在字符串中
[string] /sm[a-h]/ 表示sm后接a到h之间的任意一个字符
[^string] /sm[^a-h]/ 表示sm后接不在a到h之间的任意一个字符
^ /^h/ 匹配以h开头的
$ /h$/ 匹配以h结尾的
. /a.b/ 匹配任意一个字符在a和b之间
* /a*b/ 匹配0个或多个a在a和b之间
.* /a.*b/ 匹配任意的字符在a和b之间
二、awk的内置函数
主要分为:算术函数、字符串函数、时间函数、其它一般函数
(1)、算术函数
atan2(y,x) 返回y/x的反正切
cos(x) 返回x的余弦,x是弧度
sin(x) 返回x的正弦,x是弧度
exp(x) 返回x的幂函数
log(x) 返回x的自然对数
sqrt(x) 返回x的平方根
rand() 返回任意数字n, 0<=n<1
举例1、
awk 'BEGIN{OFMT="%.3f";fs=sin(1);fe=exp(10);fl=log(10);fi=int(3.1415);print fs,fe,fl,fi;}'
0.841 22026.466 2.303 3
OFMT设置输出数据格式保留3位小数
举例2、
获取随机数
awk 'BEGIN{srand();fr=int(100*rand();print fr)}'
(2)、字符串函数
gsub(r,s) 在整个$0中用s替代r
gsub(r,s,t) 在整个t中用s替代r
index(s,t) 返回s中字符串t的第一位置
length(s) 返回s长度
match(s,r) 测试s是否包含匹配r的字符串
split(s,a,fs) 在fs上将s分成序列a
sprint(fmt,exp) 返回经fmt格式化后的exp
sub(r,s) 用$0中最左边最长的子串代替s
substr(s,p) 返回字符串s中从p开始的后缀部分
substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分
注:awk for ...in 循环,是一个无序的循环,并不是从下标1...n开始的
举例:改变学生序号4842到4899
awk 'gsub('4842/, 4899) {print $0}' grade.txt
J.Troll 07/99 4899 Brown-3 12 26 26
printf格式化字符串输出:
%d 十进制有符号整数
%u 十进制无符号整数
%f 浮点数
%c 单个字符
%p 指针的值
%e 指数形式的浮点数
%x 无符号以十六进制表示的整数
%o 无符号以八进制表示的整数
%g 自动选择合适的表示法
awk 'BEGIN{n1=124.134;n2=-1.224;n3=1.1314;printf("%.2f,%.2u,%.2g,%x,%o\n",n1.n2,n3,n1,n2);}'
(3)一般函数
close(Expression)
system(Command)
Exepression | getline [Variable]
getline [Variable]
(4)时间函数
mktime(YYYY MM DD HH mm ss[DST]) 生成的时间格式
strftime([format [,timestamp]])
systime()
strftime日期和事件格式说明符
%a 星期几的缩写Sun
%A 星期几的完整写法(Sunday)
%b 月名的缩写
%B 月名的完整写法
%c 本地日期和事件
%d 十进制日期
%D 日期08/22/99
%e 日期如果只有一位会补上一个空格
%H 用十进制表示24小时制的小时数
%I 用十进制表示12小时制的小时数
%j 从1月1日起一年中的第几天
%m 十进制表示的月份
%M 十进制表示的分钟
%p 12小时表示法(AM/PM)
%S 十进制表示的秒
%U 十进制表示的一年中的第几个星期(星期天作为一个星期的开始)
%w 十进制表示的星期几(星期天是0)
%W 十进制表示的一年中的第几个星期(星期一作为一个星期的开始)
%x 重新设置本地日期(08/22/99 )
%X 重新设置本地时间(12:00:00)
%y 两位数字表示的年(99)
%Y 当前月份
%Z 时区(PDT)
%% 百分号%
(5)awk中的split()函数
split(s,a,seq)
解释:
将需要分割的字符s,以分割符seq进行分割,最后保存为一个数组该数组名为a
file.txt内容:
12:13:14
cat file.txt | awk '{split($0,a,":");print a[1]}' #结果:12
cat file.txt | awk '{split($0,a,":");print a[2]}' #结果:13
cat file.txt | awk '{split($0,a,":");print a[3]}' #结果:14
cat file.txt | awk '{split($0,a,":");print a[1],a[2],[a3]}' #结果:12 13 14
cat file.txt | awk '{split($0,a,":");for(item in a){print item}}'
#结果:这里for(item in a)遍历的是数组a的下标值从1开始
1 2 3
cat file.txt | awk '{split($0,a,":");for(item in a){print a[item]}}'
#结果:这里for(item in a)遍历的是数组a的下标值从1开始
12
13
14