AWK命令介绍及相关bash命令知识

awk是一个强大的文本分析工具,它把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

`awk ‘{pattern + action}’ {filenames}`

pattern:表示awk在数据中查找的内容;使用正则表达式则需要//括起来
action:表示action 是在找到匹配内容时所执行的一系列命令。
awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。

 

三种调用方式

1、命令行方式
awk [-F file-seperator] 'commands' input-file
commands是awk命令,[-F file-seperator]是可选的。input-file是待处理文件,

2、shell脚本方式
即,将所有awk命令写入一个文件,并该文件执行。然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。首行通常为:#!/bin/bash

3、将所有命令插入一个单独文件,然后调用;
awk -f awk-script-file input-file
-f加载awk-script-file的awk脚本。

 

 

举例说明

命令行方式
只是显示/etc/passwd的用户名和所在行数,中间使用制表键空格。

[root@nginx ~]# awk -F: '{print NR"\t"$1}' /etc/passwd
1    root
2    bin
3    daemon
4    adm
5    lp
6    sync
7    shutdown
8    halt
9    mail
10    operator
11    games
12    ftp
13    nobody
14    systemd-bus-proxy
15    systemd-network
16    dbus
17    polkitd
18    abrt
19    unbound
20    tss
21    libstoragemgmt
22    rpc
23    colord
24    usbmuxd
25    saslauth
26    geoclue
27    rtkit
28    rpcuser
29    nfsnobody
30    radvd
31    qemu
32    ntp
33    chrony
34    setroubleshoot
35    sssd
36    pulse
37    gdm
38    gnome-initial-setup
39    sshd
40    avahi
41    postfix
42    tcpdump
43    kyle
44    tom
45    jack

显示/etc/passwd的用户名即共分割的段数

[root@nginx ~]# awk -F: '{print $1,"===",NF}' /etc/passwd
root === 7
bin === 7
daemon === 7
adm === 7
lp === 7
sync === 7
shutdown === 7
halt === 7
mail === 7
operator === 7
games === 7

  显示/etc/passwd 行数大于2,小于5的用户名即行数

[root@nginx ~]# awk -F: 'NR > 2 &&  NR < 5 {print $1,"===",NR}' /etc/passwd
daemon === 3
adm === 4
View Code

使用正则表达式的awk:

[root@nginx ~]# awk -F: '/bash$/{print $1,"===",NR}' /etc/passwd
root === 1
kyle === 43
tom === 44
jack === 45
rose === 46

 

对第7段操作使用“~”

 

[root@nginx ~]# awk -F: '$7~/h$/{print $7,"===",NR}' /etc/passwd
/bin/bash === 1
/bin/bash === 43
/bin/bash === 44
/bin/bash === 45
/bin/bash === 46
/bin/bash === 51
/bin/bash === 52
/bin/bash === 53
/bin/bash === 54
/bin/bash === 55

 

awk可以使用变量:使用awk -v 如:

设置变量count=500

[root@nginx ~]# count=500
[root@nginx ~]# awk -v x=$count -F: '$3>=x{print $1,"===",NR}' /etc/passwd
systemd-bus-proxy === 14
polkitd === 17
unbound === 19
libstoragemgmt === 21
colord === 23
saslauth === 25
geoclue === 26
nfsnobody === 29
chrony === 33
setroubleshoot === 34
sssd === 35
gnome-initial-setup === 38
kyle === 43
tom === 44
jack === 45
rose === 46

 

bash命令补充知识

变量,用于表示程序运行的一些状态变化

命名规则:以字母或下划线开头,余下的可以是字母、数字和下划线

一般性命名规范:

1、以字母开头

2、使用下划线或中划线做单词的连接

3、同类型的使用数字区分

4、对于文件最好加上拓展名,如tar.gz;

设置变量:varname=value

删除变量 unset varname

变量有系统变量和环境变量

系统启动时会加载一下文件和目录下内容

/etc/profile

/etc/profile.d/

/etc/bashrc

/root/.bahsrc

/root/.bash-profile

在这些文件和目录里写入的变量,就会变成系统变量。

常用系统变量

PATH、PWD、LANG、HOME、HISTSIZE、PS1、IFS

 

全局变量和局部变量

[root@nginx ~]# local_var='local'
[root@nginx ~]# export whole_var='whole'
[root@nginx ~]# echo $local_var 
local
[root@nginx ~]# echo $whole_var 
whole
[root@nginx ~]# bash
[root@nginx ~]# echo $local_var

[root@nginx ~]# echo $whole_var 
whole

 

运算符

算术运算符主要有:+、-、*、/、%

关系逻辑运算符有:<、>、<=、>=、== 、!= 

INTEGER1 -eq INTEGER2
              INTEGER1 is equal to INTEGER2 ## ==

       INTEGER1 -ge INTEGER2
              INTEGER1 is greater than or equal to INTEGER2 #>=

       INTEGER1 -gt INTEGER2
              INTEGER1 is greater than INTEGER2 #>

       INTEGER1 -le INTEGER2
              INTEGER1 is less than or equal to INTEGER2 #<=

       INTEGER1 -lt INTEGER2
              INTEGER1 is less than INTEGER2 #<

       INTEGER1 -ne INTEGER2
              INTEGER1 is not equal to INTEGER2 # !=

 

赋值运算符:=、+=、*=、/=、%=

举例说明:

[root@nginx ~]# d=2
[root@nginx ~]# ((d+=3))
[root@nginx ~]# echo $d
5
[root@nginx ~]# ((d-=4))
[root@nginx ~]# echo $d
1
[root@nginx ~]# ((d*=12))
[root@nginx ~]# echo $d
12
[root@nginx ~]# ((d/=2))
[root@nginx ~]# echo $d
6
[root@nginx ~]# ((d%=4))
[root@nginx ~]# echo $d
2

if多分支

[root@nginx test]# vim check_file.sh

#!/bin/bash
var='/etc/passwd'
if [ -d $var ]
    then
        echo '$var is directory'
elif [ -b $var ]
    then
        echo '$var is block'
elif [ -f $var ]
    then
        echo '$var is regular file'
else
        echo '$var is unknow'
fi

注意:[ -b $var ]的格式,必须有空格

posted @ 2017-03-23 16:23  Great_kyle  阅读(872)  评论(0编辑  收藏  举报