awk和seq



awk

[root@koukou tan_shell]# df -Th
文件系统 类型 容量 已用 可用 已用%% 挂载点
/dev/sda3 ext4 321G 223G 83G 73% /
tmpfs tmpfs 1.9G 608K 1.9G 1% /dev/shm
/dev/sda1 ext4 92G 261M 87G 1% /boot
[root@koukou tan_shell]# df -Th | grep "/$"
/dev/sda3 ext4 321G 223G 83G 73% /
[root@koukou tan_shell]# df -Th | grep "/$"|awk '{print $5}'
83G
[root@koukou tan_shell]# df -Th | grep "/$"|awk '{print $6}'
73%
[root@koukou tan_shell]# df -Th | grep "/$"|awk '{print $6}'|tr -d "%"
73
[root@koukou tan_shell]#


[root@koukou mysql]# df -t ext4
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda3 336503968 243882004 75528488 77% /
/dev/sda1 96143116 266440 90992812 1% /boot

[root@koukou mysql]# df -t ext4|awk 'NR==1' 输出第一行
文件系统 1K-块 已用 可用 已用% 挂载点

[root@koukou mysql]# df -t ext4|awk 'END{print $0}' 输出最后一行
/dev/sda1 96143116 266440 90992812 1% /boot
[root@koukou mysql]#


几种截取某个字符的方法:

[root@koukou tan_shell]# echo "abc" |rev|cut -c1
c
[root@koukou tan_shell]# a="abc"
[root@koukou tan_shell]# echo ${a: -1}
c
[root@koukou tan_shell]# echo "abc" |awk -F "" '{print $1}'
a
[root@koukou tan_shell]# echo "abc" |awk -F "" '{print $NF}' 若要以空格为分割副则这里双引号内必须有空格
c
[root@koukou tan_shell]#




几种截取百分比的方法:


[root@koukou tan_shell]# df -Th|grep "/$"|awk '{print $6}'
74%
[root@koukou tan_shell]# df -Th|grep "/$"|awk '{print $6}'|tr -d "%"
74
[root@koukou tan_shell]# df -Th|grep "/$"|awk '{print $6}'|sed 's/%//'
74
[root@koukou tan_shell]# df -Th|grep "/$"|awk '{print int($6)}'
74
[root@koukou tan_shell]# df -Th|grep "/$"|awk '{print int(3.1415)}'
3
[root@koukou tan_shell]#



[root@koukou tan_shell]# val=this
[root@koukou tan_shell]# echo "$val is %"
this is %
[root@koukou tan_shell]# echo "$valis %"
%
[root@koukou tan_shell]# echo "${val}is %"
thisis %
[root@koukou tan_shell]# echo "${val} 'is %"
this 'is %
[root@koukou tan_shell]#


awk命令内插入其他命令的使用方法:


[root@tan anli]# awk '{ system("ls -l") }' test1.sh 有多少行执行几次

[root@tan anli]# awk '{ system("useradd" $3) }' test1.sh 每一行的第三列作为用户名useradd添加用户


[root@tan anli]# cat file
yi1 yi2 yi3 yi4
er1 er2 er3 er4
san1 san2 san3 san4

[root@tan anli]# awk '{ system("pwd ")}' file
/tan_shell/anli
/tan_shell/anli
/tan_shell/anli
[root@tan anli]#


[root@tan anli]# awk '{ system("echo " $1)}' file
yi1
er1
san1
[root@tan anli]#




打印某一行:

[root@tan tan_shell]# awk "NR==1" /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@tan tan_shell]# awk "NR==2" /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
[root@tan tan_shell]#


打印最后一个字段

[root@koukou boot]# ls -l|awk '$5>=102{print $NF}' 输出大小大于等于102的文件名

取最后一个字符
echo ${a: -1}
echo $a | rev | cut -c1

查看文件的第几行:

sed -n '5p' file1
awk 'NR==5' file1
head -5 file1 | tail -1


打印file文件内空行所在的行号:

[root@localhost tan]# awk '{if($0~/^$/)print NR}' file
2
4
[root@localhost tan]# vim file
[root@localhost tan]# cat file
sadasdsadas

sadjh

asjdh

方法二:

[root@localhost tan]# grep -n ^$ file -n是显示行号
2:
4:
[root@localhost tan]# grep -n ^a file
5:asjdh
[root@localhost tan]# cat file
sadasdsadas

sadjh

asjdh
[root@localhost tan]#


由上面可以看出,行号已经显示出来了,现在只需要提取出行号就ok了
[root@localhost tan]# grep -n ^$ file|awk -F ":" "{print $1}" //错误做法,不能用双引号
2:
4:
[root@localhost tan]# grep -n ^$ file|awk -F":" '{print $1}'
2
4
[root@localhost tan]#
[root@localhost tan]# grep -n ^$ file|awk 'BEGIN{FS=":"}{print $1}'
2
4
[root@localhost tan]#
[root@localhost tan]# grep -n ^$ file|awk -F: 'BEGIN{FS=":"}{print $1}'
2
4
[root@localhost tan]#




BEGIN{...}.....END{..........} 语句块


该语句执行不要求从文件读取数据

[root@koukou tan_shell]# route -n |grep "UG"|awk '{print $2}'
10.0.1.254
[root@koukou tan_shell]# awk -F: 'BEGIN{print "start"}' /etc/passwd
start
[root@koukou tan_shell]# awk -F: 'BEGIN{print "start"}' 输出开始字符串
start
[root@koukou tan_shell]# awk -F: 'BEGIN{print start}'

[root@koukou tan_shell]# awk -F: 'BEGIN{start=10;print start}' 不加双引号的话就认为是变量
10
[root@koukou tan_shell]#



[root@koukou tan_shell]# awk -F: 'BEGIN{print "hello!!!"}{print $1}' test.txt
hello!!!
abchsafkjhd
def
gjtshfajas
def
abc
abc
haha
[root@koukou tan_shell]# awk -F: 'BEGIN{print "hello!!!"}{print $1}'
hello!!!
test.txt
test.txt
afjk
afjk
safd fads
safd fads
^C
[root@koukou tan_shell]#


模式匹配,打印输出:

[root@koukou tan_shell]# awk -F: '/root/{print $1}' /etc/passwdroot
operator
[root@koukou tan_shell]# awk -F: '/^root/{print $1}' /etc/passwd
root
[root@koukou tan_shell]# awk -F: '/bash/{print $1}' /etc/passwd
root
mysql
lizhenhua
weichao
tan
tan1
tan2
tan3
js1
kf1
js2
kf2
JECK
tom
jerry
lee
[root@koukou tan_shell]# awk -F: '/bash$/{print $1}' /etc/passwd
root
mysql
lizhenhua
weichao
tan
tan1
tan2
tan3
js1
kf1
js2
kf2
JECK
tom
jerry
lee
[root@koukou tan_shell]#



[root@koukou tan_shell]# awk -F: '/root/' /etc/passwd 默认打印出整行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@koukou tan_shell]#


BEGIN里面的FS:相当于-F的功能

[root@koukou tan_shell]# awk 'BEGIN{FS=":"}NR<=5{print $1,NR}' /etc/passwd FS:分割符,NR行号
root 1
bin 2
daemon 3
adm 4
lp 5
[root@koukou tan_shell]#
[root@koukou tan_shell]# awk 'BEGIN{FS=" "}NR<=5{print $1,NR}' /etc/passwd
root:x:0:0:root:/root:/bin/bash 1
bin:x:1:1:bin:/bin:/sbin/nologin 2
daemon:x:2:2:daemon:/sbin:/sbin/nologin 3
adm:x:3:4:adm:/var/adm:/sbin/nologin 4
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 5
[root@koukou tan_shell]#

OFS: {print $1, NR}的分割符,默认为一个空格


[root@koukou tan_shell]# awk 'BEGIN{FS=":"; OFS="--------"}NR<=5{print $1, NR}' /etc/passwd
root--------1
bin--------2
daemon--------3
adm--------4
lp--------5
[root@koukou tan_shell]#

[root@koukou tan_shell]# awk 'BEGIN{FS=":"; OFS="\t\t\t\t"}NR<=5{print $1, NR}' /etc/passwd
root 1
bin 2
daemon 3
adm 4
lp 5
[root@koukou tan_shell]#



[root@koukou tan_shell]# echo "abc hij:xyz 123 456:qq" |awk -F"[ \t:]+" '{print $3}' 分割符为空格或者\t
xyz
[root@koukou tan_shell]# echo "abc hij:xyz 123 456:qq" |awk -F"[ :]+" '{print $3}'
xyz
[root@koukou tan_shell]# awk 'BEGIN{a=10; b=12 ;print a+b}'
22
[root@koukou tan_shell]# echo "abc hij:xyz 123 456:qq" |awk -F: '{print $3}'
qq


计算总的行数:

[root@koukou tan_shell]# cat test.txt
abchsafkjhd tom
saf
asfs
cfh
kjj
[root@koukou tan_shell]# awk '{print NR}' test.txt
1
2
3
4
5
[root@koukou tan_shell]# awk 'END{print NR}' /etc/passwd
54
[root@koukou tan_shell]# awk 'END{print NR}' test.txt
5
[root@koukou tan_shell]# awk 'BEGIN{print NR}' test.txt
0
[root@koukou tan_shell]#

[root@koukou tan_shell]# awk 'BEGIN{i=0}{i++}END{print i}' test.txt
5

[root@koukou tan_shell]# awk 'BEGIN{i=0}{i++}{print i}' test.txt
1
2
3
4
5
[root@koukou tan_shell]#
[root@koukou tan_shell]# awk 'BEGIN{i=0}{i++;print i}' test.txt
1
2
3
4
5
[root@koukou tan_shell]#
[root@koukou tan_shell]# awk -F: '$3==509{print $1}' /etc/passwd
js1
[root@koukou tan_shell]#
[root@koukou tan_shell]# awk -F: '$3+$4>=5000{print $1}' /etc/passwd
nfsnobody
[root@koukou tan_shell]#


[root@koukou tan_shell]# awk -F: '$1=="root"{print $1}' /etc/passwd 匹配字符串
root
[root@koukou tan_shell]# awk -F: '$1=="root"{print $3}' /etc/passwd
0
[root@koukou tan_shell]# awk -F: '$1=="root"{print $4}' /etc/passwd
0
[root@koukou tan_shell]# awk -F: '$1=="root"{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@koukou tan_shell]#



-v选项 接受变量



[root@koukou tan_shell]# awk '$1~/root/{print $0}' /etc/passwd ~匹配,每一行是否包含有root,有则输出整行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@koukou tan_shell]# awk '$0~/root/{print $1}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@koukou tan_shell]# awk -F:'$0~/root/{print $1}' /etc/passwd
^C
[root@koukou tan_shell]# awk -F: '$0~/root/{print $1}' /etc/passwd
root
operator
[root@koukou tan_shell]#



[root@koukou tan_shell]# a=1
[root@koukou tan_shell]# b=2
[root@koukou tan_shell]# awk -v v1=$a -v v2=$b 'BEGIN{print v1/v2}'
0.5
[root@koukou tan_shell]# c=`awk -v v1=$a -v v2=$b 'BEGIN{print v1/v2}'`
[root@koukou tan_shell]# echo $c
0.5
[root@koukou tan_shell]#




中英文切换:

LANG=C C即ascii, 或LANG=也可, 自动使用英文
vim /etc/sysconfig/i18n
echo $LANG
LANG="en_US.UTF-8"
LANG="zh_CN.UTF-8"


[root@koukou 桌面]# echo $LANG
zh_CN.UTF-8
[root@koukou 桌面]#
[root@koukou 桌面]# LANG=
[root@koukou 桌面]# echo $LANG

[root@koukou 桌面]#



[root@koukou tan_shell]# c=`awk 'BEGIN{print a/b}'`
awk: 致命错误: 试图除0
[root@koukou tan_shell]# c=`awk 'BEGIN{a=1;b=2;print a/b}'`
[root@koukou tan_shell]# echo $c
0.5
[root@koukou tan_shell]# LANG= 这样设置一下,错误提示就变为英文的了
[root@koukou tan_shell]# c=`awk 'BEGIN{print a/b}'`
awk: fatal: division by zero attempted
[root@koukou tan_shell]#




[root@koukou tan_shell]# ifconfig -a | grep "^\w" 字母数字下划线开头的
eth0 Link encap:Ethernet HWaddr 00:30:67:F2:0C:21
eth1 Link encap:Ethernet HWaddr EC:88:8F:EF:3D:03
lo Link encap:Local Loopback
vmnet1 Link encap:Ethernet HWaddr 00:50:56:C0:00:01
vmnet2 Link encap:Ethernet HWaddr 00:50:56:C0:00:02
vmnet3 Link encap:Ethernet HWaddr 00:50:56:C0:00:03
vmnet8 Link encap:Ethernet HWaddr 00:50:56:C0:00:08
[root@koukou tan_shell]#




模式匹配:


[root@koukou tan_shell]# awk -F: '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@koukou tan_shell]# awk -F: '/root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@koukou tan_shell]# awk 'NR==4' /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@koukou tan_shell]#



判断:


[root@koukou tan_shell]# awk -F: '{if($0 ~ /^root/)print $1}' /etc/passwd
root
[root@koukou tan_shell]# awk -F: '/root/{if($0 ~ /^root/)print $1}' /etc/passwd
root
[root@koukou tan_shell]# awk -F: 'NR<=10{if($3==501)print $3;else if($3==502)print NR;else print NF}' /etc/passwd
7
7
7
7
7
7
7
7
7
7
[root@koukou tan_shell]#


[root@koukou tan_shell]# awk -F: '{if($1 == "root" || $3 == 503)print "ok"}' /etc/passwd
ok
[root@koukou tan_shell]# awk -F: '{if($1 ~ /^root/ || $3 == 503)print "ok"}' /etc/passwd
ok
[root@koukou tan_shell]# awk -F: '{if(NR>3)next;print $1}END{}print NR}' /etc/passwd
awk: {if(NR>3)next;print $1}END{}print NR}
awk: ^ syntax error
[root@koukou tan_shell]# awk -F: '{if(NR>3)next;print $1}END{print NR}' /etc/passwd
root
bin
daemon
54
[root@koukou tan_shell]# awk -F: '{if(NR>3){next;}; print $1}END{print NR}' /etc/passwd 没包含在判断语句内还是不会读取下一行,可见next的作用是读取下一行,不执行print$
root
bin
daemon
54
[root@koukou tan_shell]#

[root@koukou tan_shell]# awk -F: '{if(NR>3){exit;}; print $1}END{print NR}' /etc/passwd exit跳出循环,执行END后面的语句
root
bin
daemon
4
[root@koukou tan_shell]#


[root@koukou tan_shell]# awk 'BEGIN{for(i=1;i<=5;i++)print i}'
1
2
3
4
5
[root@koukou tan_shell]#


[root@koukou tan_shell]# df -Th |grep "/$"|awk '{print int($6)}'
74
[root@koukou tan_shell]# df -Th |grep "/$"|awk '{print int(4.222}'
awk: {print int(4.222}
awk: ^ syntax error
[root@koukou tan_shell]# df -Th |grep "/$"|awk '{print int(4.222)}'
4
[root@koukou tan_shell]#

printf:取小数精度
[root@koukou tan_shell]# df -Th |grep "/$"|awk '{printf "%.2f\n",3.3333}'
3.33
[root@koukou tan_shell]# df -Th |grep "/$"|awk '{printf "%.3f\n",3.3333}'
3.333
[root@koukou tan_shell]#


system函数调用,实现在awk内部调用命令


[root@koukou tan_shell]# cat test.txt
abchsafkjhd tom
[root@koukou tan_shell]# awk '{system("useradd " $2)}' test.txt useradd后面要空格
useradd: user 'tom' already exists
[root@koukou tan_shell]# userdel -r tom
userdel: /var/spool/mail/tom not owned by tom, not removing
[root@koukou tan_shell]# awk '{system("useradd " $2)}' test.txt
Creating mailbox file: File exists
[root@koukou tan_shell]#


$1 ,$0,NR,NF,$NF,$(NF-1)的意思:

$1是第一个字段,$0是整行,N是行号,NF是是最后一个字段的位置,$NF是最后一个字段的内容

[root@koukou tan_shell]# awk -F: 'BEGIN{OFS="\t\t"}$3<=5{print $1 ,$0,NR,NF,$NF,$(NF-1)}' /etc/passwd
root root:x:0:0:root:/root:/bin/bash 1 7 /bin/bash /root
bin bin:x:1:1:bin:/bin:/sbin/nologin 2 7 /sbin/nologin /bin
daemon daemon:x:2:2:daemon:/sbin:/sbin/nologin 3 7 /sbin/nologin /sbin
adm adm:x:3:4:adm:/var/adm:/sbin/nologin 4 7 /sbin/nologin /var/adm
lp lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 5 7 /sbin/nologin /var/spool/lpd
sync sync:x:5:0:sync:/sbin:/bin/sync 6 7 /bin/sync /sbin
[root@koukou tan_shell]# awk -F: 'BEGIN{OFS="\t\t"}$3<=5' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
[root@koukou tan_shell]#




seq






[root@koukou 桌面]# seq 5
1
2
3
4
5
[root@koukou 桌面]# seq -w 5
1
2
3
4
5
[root@koukou 桌面]# seq -w 10 以最大的等宽显示
01
02
03
04
05
06
07
08
09
10
[root@koukou 桌面]#



[root@koukou tan_shell]# seq -s* 10
1*2*3*4*5*6*7*8*9*10
[root@koukou tan_shell]# seq -s* 10|bc 求10!
3628800
[root@koukou tan_shell]#
[root@koukou ~]# seq -s+ 1 2 10|bc
25
[root@koukou ~]# seq -s+ 1 2 10 从1开始,隔两个数取一个,取到10
1+3+5+7+9
[root@koukou ~]#



[root@koukou mysql]# seq 10|tr -d "59"
1
2
3
4

6
7
8

10
[root@koukou mysql]# seq 10|tr -d "59"|grep -v "^$" 去掉空行
1
2
3
4
6
7
8
10





























你可能感兴趣的:(shell编程)