shell的grep和sed和awk

【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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351