shell初级编程学习总结

变量

定义变量

定义变量=左右不能加空格:

[root@iZuf6g59pf51fzxynbonb1Z zzy]# a=1
[root@iZuf6g59pf51fzxynbonb1Z zzy]# a = 1
-bash: a: 未找到命令

使用变量

使用变量最好加上花括号{}:

[root@iZuf6g59pf51fzxynbonb1Z zzy]# project='test'
[root@iZuf6g59pf51fzxynbonb1Z zzy]# project_svn='test2'

[root@iZuf6g59pf51fzxynbonb1Z zzy]# echo "$project_svn_$project"
test
[root@iZuf6g59pf51fzxynbonb1Z zzy]# echo "${project_svn}_${project}"
test2_test

echo中使用变量

echo 中使用变量最好使用双引号,如果使用单引号,变量也要使用单引号括起来:

[root@iZuf6g59pf51fzxynbonb1Z zzy]# a=1
[root@iZuf6g59pf51fzxynbonb1Z zzy]# echo 'test_'${a}''
test_1
[root@iZuf6g59pf51fzxynbonb1Z zzy]# echo 'test_${a}'
test_${a}
[root@iZuf6g59pf51fzxynbonb1Z zzy]# echo "test_${a}"
test_1

只读变量

readonly标记的变量为只读变量,只读变量不可修改:

[root@iZuf6g59pf51fzxynbonb1Z zzy]# name='zzy'
[root@iZuf6g59pf51fzxynbonb1Z zzy]# readonly name
[root@iZuf6g59pf51fzxynbonb1Z zzy]# name='change'
-bash: name: 只读变量

删除变量

删除变量不能删除只读变量:

[root@iZuf6g59pf51fzxynbonb1Z zzy]# unset name
-bash: unset: name: 无法反设定: 只读 variable

变量中嵌套变量

当变量中嵌套变量时,需要使用eval关键字,当使用echo的时候需要在变量左边加\

#!/bin/bash
for i in {1..10}
do
  eval test_${i}=${i}
done

for i in {1..10}
do
  eval echo \${test_${i}}
done

命令替换

使用$(命令)的形式替换命令,目的是获取命令的输出。

[root@iZuf6g59pf51fzxynbonb1Z zzy]# today=$(date)
[root@iZuf6g59pf51fzxynbonb1Z zzy]# echo ${today}
2020年 12月 18日 星期五 23:18:09 CST

删除文件filename中包含需要删除的文件列表时:

rm $(cat filename)

表达式

方括号使用

[][[]]内都可以写表达式,但是推荐使用第二种写法,括号内表达式要与最里边的括号左右两边都有空格。

文件测试用算符

运算符说明
-e file如果给定的文件存在,则条件测试的结果为真 。
-r file如果给定的文件存在,且其访问权限是当前用户可读的,则条件测试的结果为真 。
-w file如果给定的文件存在,且其访问权限是当前用户可写的,则条件测试的结果为真 。
-x file如果给定的文件存在,且其访问权限是当前用户可执行的,则条件测试的结果为真 。
-s file如果给定的文件存在,且其大小大于 0, 则条件测试的结果为真 。
-f file如果给定的文件存在,且是一个普通文件,则条件测试的结果为真。
-d file如果给定的文件存在,且是一个目录,则条件测试的结果为真 。
-L file如果给定的文件存在,且是一个符号链接文件,则条件测试的结果为真(注意 :此处的 L 为大写) 。
-c file如果给定的文件存在,且是字符特殊文件,则条件测试的结果为真。
-b file如果给定的文件存在,且是块特殊文件,则条件测试的结果为真 。
-p file如果给定的文件存在,且是命名的管道文件,则条件测试的结果为真。

字符串测试用算符

运算符说明
-z str如果给定的字符串的长度为 0, 则条件测试的结果为真 。
-n str如果给定的字符串的长度大于 0, 则条件测试的结果为真 。
s1=s2如果给定的字符串 s1 等同于字符串 s2, 则条件测试的结果为真 。
s1!=s2如果给定的字符串 sl 不等同千字符串 s2, 则条件测试的结果为真 。
s1<s2如果给定的字符串 sl 小千字符串 s2, 则条件测试的结果为真 。
s1>s2若给定的字符串 sl 大于字符串 s2, 则条件测试的结果为真 。

整数运算符

运算符说明
-eq=
-ne!=
-gt>
-lt<
-ge大于等于
-le小于等于

函数

  • 函数名()中不能加参数

  • 函数中如果不显示的指定return,则返回最后一条命令的值。

  • 函数的switch case 写法:

    #!/bin/bash
    function CDAN(){
    cat << EOF
    1. 米饭
    2. 面条
    3. 包子
    EOF
    }
    CDAN
    read -p "请问今天要吃些什么?:" NUM
    expr ${NUM} + 1 &>/dev/null
    if [[ "$?" -ne 0 ]]
     then
       echo "请您输入{1|2|3}"
       exit 1
    fi
    
    case ${NUM} in
      1)
        echo "小二,来一碗米饭";;
      2) 
        echo "小二, 来一碗面条";;
      3)
        echo "小二,来一锅包子";;
    esac
    

字符串截取

[root@iZuf6g59pf51fzxynbonb1Z zzy]# varible="first string, last string, end"
  • 从左往右数,截取最后一个string右边的字符串:

    [root@iZuf6g59pf51fzxynbonb1Z zzy]# echo "${varible##*string}"
    , end
    
  • 从左往右数,截取第一个string右边的字符串:

    [root@iZuf6g59pf51fzxynbonb1Z zzy]# echo "${varible#*string}"
    , last string, end
    
  • 从右往左数,截取最后一个string左边的字符串:

    [root@iZuf6g59pf51fzxynbonb1Z zzy]# echo "${varible%%string*}"
    first 
    
  • 从右往左数,截取第一个string左边的字符串:

    [root@iZuf6g59pf51fzxynbonb1Z zzy]# echo "${varible%string*}"
    first string, last 
    

截取指定长度字符串

${变量:n1: n2}:从n1开始的n2个字符。

数组

定义

  • 用括号表示数组,元素间要用空格或者换行分隔

    array_name=(v1 v2 v3)
    

    也可以无需定义直接给数组赋值:

    array_name[0] = v1
    array_name[1] = v2
    array_name[2] = v3
    

    下标没要求必须连续。

读取

  • 读取数组的一般格式为${array_name[index]}
  • 获取数组所有元素${array_name[*]}${array_name[@]}

获取数组的长度

  • 获取数组元素个数${#array_name[@]}${#array_name[*]}
  • 获取数组单个元素的长度${#array_name[index]}

字典

定义

  • 必须先声明,再定义:

    [root@iZuf6g59pf51fzxynbonb1Z zzy]# declare -A dic
    
    [root@iZuf6g59pf51fzxynbonb1Z zzy]# dic=([no1]="yhc" [no2]="yht" [no3]="cc")
    
    [root@iZuf6g59pf51fzxynbonb1Z zzy]# echo ${dic[no3]}
    cc
    
    # 获取字典的key
    [root@iZuf6g59pf51fzxynbonb1Z zzy]# echo ${!dic[*]}
    no3 no2 no1
    
    # 获取字典的value
    [root@iZuf6g59pf51fzxynbonb1Z zzy]# echo ${dic[*]}
    cc yht yhc
    
  • 当数据量较大时shell中的字典效率低下,不建议使用。

sed的用法总结

基础语法

sed [-nefr] [n1 n2] 动作

参数说明

参数说明
-n安静模式,只有经过 sed 处理过的行才会显示出来,其他不显示 。
-e表示直接在命令行模式上进行 sed 的操作 ,也就是不被修改原文件。
-f将 sed 的操作写在一个文件里,用的时候使用" 行 sed 操作了 。
-r表示使 sed 支持扩展正则表达式 。
-i直接修改读取的文件内容,而不是输出到终端 。
n1 n2选择要进行处理的行 。 "10,20 "表示在 10~20 行之间进行处理 。

动作支持如下参数

参数说明
a表示添加,后接字符串,添加到当前行的下一行 。
c表示替换,后接字符串,可用它替换 nl 到 n2 之间的行 。
d表示删除符合模式的行,其语法为" sed’/regexp/d’", " //"之间是正则表达式,模式在 d 前面, d 后面一般不接任何内容 。
i表示插入,后接字符串,添加到当前行的上一行 。
p表示打印,打印选择的某个数据,通常与 “-n” (安静模式)一起使用 。
s表示搜索,还可以替换,类似与 vim 里的搜索替换功能 。 例如 "1,20s/old/new/g"表示替换 1 - 20 行的 old 为 new, g 在这里表示处理这一行所有匹配的内容 。

实例

  • 显示password内容,将 2 ~ 5 行删除后显示,命令如下所示:

    cat -n /home/zzy/passwd | sed '2,5d'

    [root@iZuf6g59pf51fzxynbonb1Z zzy]# cat -n /home/zzy/passwd | sed '2,5d'
         1  root:x:0:0:root:/root:/bin/bash
         6  sync:x:5:0:sync:/sbin:/bin/sync
         7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
         8  halt:x:7:0:halt:/sbin:/sbin/halt
         9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
        10  operator:x:11:0:operator:/root:/sbin/nologin
        11  games:x:12:100:games:/usr/games:/sbin/nologin
        12  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
        13  nobody:x:99:99:Nobody:/:/sbin/nologin
        14  systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
        15  dbus:x:81:81:System message bus:/:/sbin/nologin
        16  polkitd:x:999:998:User for polkitd:/:/sbin/nologin
        17  sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
        18  postfix:x:89:89::/var/spool/postfix:/sbin/nologin
        19  chrony:x:998:996::/var/lib/chrony:/sbin/nologin
        20  nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
        21  tcpdump:x:72:72::/:/sbin/nologin
        22  zzy:x:1000:1000::/home/zzy:/bin/bash
        23  redis:x:997:992:Redis Database Server:/var/lib/redis:/sbin/nologin
    
  • 在第 2 行后面的一行中加上 “hello,world” 字符串,命令如下所示:

    cat -n /home/zzy/passwd | sed '2a hello world'

    [root@iZuf6g59pf51fzxynbonb1Z zzy]# cat -n /home/zzy/passwd | sed '2a hello world'
         1  root:x:0:0:root:/root:/bin/bash
         2  bin:x:1:1:bin:/bin:/sbin/nologin
    hello world
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
         4  adm:x:3:4:adm:/var/adm:/sbin/nologin
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
         6  sync:x:5:0:sync:/sbin:/bin/sync
         7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
         8  halt:x:7:0:halt:/sbin:/sbin/halt
         9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
        10  operator:x:11:0:operator:/root:/sbin/nologin
        11  games:x:12:100:games:/usr/games:/sbin/nologin
        12  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
        13  nobody:x:99:99:Nobody:/:/sbin/nologin
        14  systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
        15  dbus:x:81:81:System message bus:/:/sbin/nologin
        16  polkitd:x:999:998:User for polkitd:/:/sbin/nologin
        17  sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
        18  postfix:x:89:89::/var/spool/postfix:/sbin/nologin
        19  chrony:x:998:996::/var/lib/chrony:/sbin/nologin
        20  nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
        21  tcpdump:x:72:72::/:/sbin/nologin
        22  zzy:x:1000:1000::/home/zzy:/bin/bash
        23  redis:x:997:992:Redis Database Server:/var/lib/redis:/sbin/nologin
    
  • 在第二行后面的一行中加上两行字,例如"this is first line!“和"this is second line!”:

    cat -n /home/zzy/passwd | sed '2a this is first line! \ # 使用续航符 \ 后按回车后续航

    >this is second line!'

    [root@iZuf6g59pf51fzxynbonb1Z zzy]# cat -n /home/zzy/passwd | sed '2a this is first line! \
    > this is second line!'
         1  root:x:0:0:root:/root:/bin/bash
         2  bin:x:1:1:bin:/bin:/sbin/nologin
    this is first line! 
    this is second line!
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
         4  adm:x:3:4:adm:/var/adm:/sbin/nologin
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
         6  sync:x:5:0:sync:/sbin:/bin/sync
         7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
         8  halt:x:7:0:halt:/sbin:/sbin/halt
         9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
        10  operator:x:11:0:operator:/root:/sbin/nologin
        11  games:x:12:100:games:/usr/games:/sbin/nologin
        12  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
        13  nobody:x:99:99:Nobody:/:/sbin/nologin
        14  systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
        15  dbus:x:81:81:System message bus:/:/sbin/nologin
        16  polkitd:x:999:998:User for polkitd:/:/sbin/nologin
        17  sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
        18  postfix:x:89:89::/var/spool/postfix:/sbin/nologin
        19  chrony:x:998:996::/var/lib/chrony:/sbin/nologin
        20  nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
        21  tcpdump:x:72:72::/:/sbin/nologin
        22  zzy:x:1000:1000::/home/zzy:/bin/bash
        23  redis:x:997:992:Redis Database Server:/var/lib/redis:/sbin/nologin
    
  • 将 2 ~ 5 行的内容替换成" I am a good man! " :

    cat -n /home/zzy/passwd | sed '2,5c I am a good man!'

    [root@iZuf6g59pf51fzxynbonb1Z zzy]# cat -n /home/zzy/passwd | sed '2,5c I am a good man!'
         1  root:x:0:0:root:/root:/bin/bash
    I am a good man!
         6  sync:x:5:0:sync:/sbin:/bin/sync
         7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
         8  halt:x:7:0:halt:/sbin:/sbin/halt
         9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
        10  operator:x:11:0:operator:/root:/sbin/nologin
        11  games:x:12:100:games:/usr/games:/sbin/nologin
        12  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
        13  nobody:x:99:99:Nobody:/:/sbin/nologin
        14  systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
        15  dbus:x:81:81:System message bus:/:/sbin/nologin
        16  polkitd:x:999:998:User for polkitd:/:/sbin/nologin
        17  sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
        18  postfix:x:89:89::/var/spool/postfix:/sbin/nologin
        19  chrony:x:998:996::/var/lib/chrony:/sbin/nologin
        20  nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
        21  tcpdump:x:72:72::/:/sbin/nologin
        22  zzy:x:1000:1000::/home/zzy:/bin/bash
        23  redis:x:997:992:Redis Database Server:/var/lib/redis:/sbin/nologin
    
  • 只显示 5 ~7 行,注意参数 “p” 与 “-n” 的配合使用,命令如下:

    cat -n /home/zzy/passwd | sed -n '5,7p'

    [root@iZuf6g59pf51fzxynbonb1Z zzy]# cat -n /home/zzy/passwd | sed -n '5,7p'
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
         6  sync:x:5:0:sync:/sbin:/bin/sync
         7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    
  • 使用 ifconfigsed 组合来列出特定网卡的 IP:

    首先使用ifconfig eth0 查看eth0网卡信息:

    [root@iZuf6g59pf51fzxynbonb1Z zzy]# ifconfig eth0
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 172.19.231.192  netmask 255.255.240.0  broadcast 172.19.239.255
            ether 00:16:3e:08:74:5c  txqueuelen 1000  (Ethernet)
            RX packets 2548844  bytes 459515422 (438.2 MiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 2684956  bytes 398791222 (380.3 MiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    

    接着使用命令ifconfig eth0 | grep "inet" | sed 's/^.*inet //g' | sed 's/netmask.*$//g'掐头去尾:

    [root@iZuf6g59pf51fzxynbonb1Z zzy]# ifconfig eth0 | grep "inet" | sed 's/^.*inet //g' | sed 's/netmask.*$//g'
    172.19.231.192 
    
  • 在 /etc/man.config 中,将有 man 的设置取出,但不要说明内容(即在抓取特定内容的同时, 去掉 以"#" 号开头的内容和空行) 。 命令如下 :

    cat /etc/man_db.conf | grep 'MAN'| sed 's/#.*$//g' | sed '/^$/d'

    [root@iZuf6g59pf51fzxynbonb1Z zzy]# cat /etc/man_db.conf | grep 'MAN'| sed 's/#.*$//g' | sed '/^$/d'
    MANDATORY_MANPATH                       /usr/man
    MANDATORY_MANPATH                       /usr/share/man
    MANDATORY_MANPATH                       /usr/local/share/man
    MANPATH_MAP     /bin                    /usr/share/man
    MANPATH_MAP     /usr/bin                /usr/share/man
    MANPATH_MAP     /sbin                   /usr/share/man
    MANPATH_MAP     /usr/sbin               /usr/share/man
    MANPATH_MAP     /usr/local/bin          /usr/local/man
    MANPATH_MAP     /usr/local/bin          /usr/local/share/man
    MANPATH_MAP     /usr/local/sbin         /usr/local/man
    MANPATH_MAP     /usr/local/sbin         /usr/local/share/man
    MANPATH_MAP     /usr/X11R6/bin          /usr/X11R6/man
    MANPATH_MAP     /usr/bin/X11            /usr/X11R6/man
    MANPATH_MAP     /usr/games              /usr/share/man
    MANPATH_MAP     /opt/bin                /opt/man
    MANPATH_MAP     /opt/sbin               /opt/man
    MANDB_MAP       /usr/man                /var/cache/man/fsstnd
    MANDB_MAP       /usr/share/man          /var/cache/man
    MANDB_MAP       /usr/local/man          /var/cache/man/oldlocal
    MANDB_MAP       /usr/local/share/man    /var/cache/man/local
    MANDB_MAP       /usr/X11R6/man          /var/cache/man/X11R6
    MANDB_MAP       /opt/man                /var/cache/man/opt
    

用法举例

  1. sed的基础用法

    • 删除行首空格sed 's/[[:space:]]*//g' filename

    • 在行后和行前添加新行(这里的 pattern 是指输入特定的正则表达式来指定的内容,其中,"&”代表 pattern) :sed 's/pattern/&\n/g' filename

      在特定行后添加新行的命令如下所示sed 's/^halt.*$/&\n添加内容/g' filename

      在特定行前添加新行的命令如下所示sed 's/^halt.*$/添加内容\n&/g' filename

    • 使用变量替换(使用双引号)sed "s/$var1/$var2/g" filename

    • 在第一行前插入文本sed -i '1 i\插入字符串' filename

    • 在最后一行插入字符串sed -i '$ a\插入字符串' filename

    • 在匹配行前插入字符串sed -e '/pattern/i"插入字符串2"' filename

    • 在匹配行后插入字符串sed -e '/pattern/a"插入字符串2"' filename

    • 删除文本中 空行和空格组成的行及"#"号注释的行 :grep -v ^# filename | sed /^[[:space:]]*$/d | sed /^$/d

    • 将指定目录下所有文件中的zhangsan替换为lisi:

       sed -i 's/zhangsan/lisi/g' `grep zhangsan -rl /home/`
      
  2. 结合正则表达式替换

    原文件zhangsan内容:

    home/html/www.5566.com/produce/2007080412/315613171.shtml
    home/html/www.5566.com/produce/20080808/311217.shtml
    home/html/www.5566.com/produce/20090909/311412.shtml
    

    将home/html/替换为http://: sed -i 's/home\/html\//http:\/\//g' zhangsan

  3. 在配置.conf文件时,为相邻的几行添加# 号

    第31到36行开头添加#: sed -i '31,36 s/^/#/' test.txt

    去掉第31到36行开头#sed -i '31,36 s/^#// test.txt'

  4. 利用sed分析日志

    cat /var/log/secure | sed -n '/Dec 21 13:45:08/,/Dec 21 13:45:11/p'

    [root@iZuf6g59pf51fzxynbonb1Z zzy]# cat /var/log/secure | sed -n '/Dec 21 13:45:08/,/Dec 21 13:45:11/p'
    Dec 21 13:45:08 iZuf6g59pf51fzxynbonb1Z sshd[20244]: Accepted password for root from 185.177.125.11 port 44630 ssh2
    Dec 21 13:45:08 iZuf6g59pf51fzxynbonb1Z sshd[20244]: pam_unix(sshd:session): session opened for user root by (uid=0)
    Dec 21 13:45:09 iZuf6g59pf51fzxynbonb1Z sshd[20244]: pam_unix(sshd:session): session closed for user root
    Dec 21 13:45:11 iZuf6g59pf51fzxynbonb1Z sshd[20391]: Accepted password for root from 185.177.125.11 port 7671 ssh2
    

awk的用法总结

awk是逐行处理文件的。

基础语法

awk 'pattern {action}' filename

  • pattern 正则表达式,表示awk在数据中查找的内容,如果是匹配范围和sed用法一样:sed -i '31,36 s/^/#/' test.txt使用逗号分隔

    省略pattern表示对所有行进行操作。

  • action是在找到匹配内容时所执行的一系列命令, 多个命令由分号;分隔

    省略action会执行默认的操作,将操作结果在标准输出上显示。

  • 但是不能同时省略pattern和action。

awk调用方式

  1. 命令行方式

    awk [-F field-separator] 'commands' filename

    • command是真正的awk命令
    • [-F域分隔符] 是可选的,由域分隔符分开的每一项都称为一个域。在不指名域的情况下,默认的域分隔符是空格。
    • filename是待处理的文件
  2. 使用"-f" 选项调用awk程序

    可以将awk程序写入一个文件,然后在awk命令行中用"-f"选项调用并执行这段程序:awk -f awk文件名 filename,filename为待处理文件。

  3. 利用命令解释器调用awk程序

    利用Linux系统支持的命令解释器功能可以将一段awk程序写入文本文件,然后在它的第一行加上#! /bin/awk -f

awk详细语法

awk [-F re] [parameter...] ['prog'] [-f progfile][in_file...]

  • -F re: 指定分隔符

  • parameter: 定义变量并赋值

  • prog:awk 的程序语句段,必须使用单引号括起来

    程序语句段标准形式:awk 'pattern {action}' filename

  • -f progfile: 使用写有awk程序的脚本文件

  • in_file: awk的输入文件,awk运行对多个输入文件进行处理,但是不会修改输入文件。

    如果未指定输入文件,那么awk将接受标准输入,并将结果显示在标准输出上。

awk脚本编写

  1. awk的内置变量

    • ARGC: 命令行参数个数。
    • ARGV: 命令行参数排列。
    • ENVIRON: 支持队列中系统环境变量的使用。
    • FNR: 浏览文件的记录数。
    • FS:设置输入域分隔符,等价于命令行“-F”。
    • RS: 输入行分隔符。
    • NF:浏览记录域的个数(分隔后的字段个数)。
    • NR:已读的记录数(行数)。
    • OFS:输出域分隔符。
    • ORS:输出行分隔符。

    $0指整条记录。$1表示当前行的第一个域。$2表示当前行的第二个域。

  2. pattern/action模式

    针对匹配的行执行action:

    • 判断当前是不是空格:/^$/ {print "this is a blank"}
    • 判断第五个字段是不是含有"MA": $5 ~ /MA/ {print $1 "," $3}
  3. awk与shell 混用

    awk与shell混用的关键是awk与shell脚本间的信息交流。

    • awk使用shell脚本中的变量:

      TIMEOUT=60
      awk -v time="$TIMEOUT" 'BEGIN{print time}'
      

      使用-v定义在commands中使用的变量,使用$符来获取脚本中的变量。

    • shell脚本中的命令获取awk的值:

      result=`awk -v time="$TIMEOUT" 'BEGIN{print time}'`
      
  4. awk中的print和printf

    • print函数的参数可以是变量、数值或字符串。
    • 字符串必须用双引号引用,参数用逗号分隔。
    • printf可以格式化字符串。
    [root@iZuf6g59pf51fzxynbonb1Z zzy]# awk -F ':' '{printf("filename:%10s, linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /home/zzy/passwd 
    filename:/home/zzy/passwd, linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
    filename:/home/zzy/passwd, linenumber:2,columns:7,linecontent:bin:x:1:1:bin:/bin:/sbin/nologin
    filename:/home/zzy/passwd, linenumber:3,columns:7,linecontent:daemon:x:2:2:daemon:/sbin:/sbin/nologin
    filename:/home/zzy/passwd, linenumber:4,columns:7,linecontent:adm:x:3:4:adm:/var/adm:/sbin/nologin
    filename:/home/zzy/passwd, linenumber:5,columns:7,linecontent:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    filename:/home/zzy/passwd, linenumber:6,columns:7,linecontent:sync:x:5:0:sync:/sbin:/bin/sync
    filename:/home/zzy/passwd, linenumber:7,columns:7,linecontent:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    filename:/home/zzy/passwd, linenumber:8,columns:7,linecontent:halt:x:7:0:halt:/sbin:/sbin/halt
    filename:/home/zzy/passwd, linenumber:9,columns:7,linecontent:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    filename:/home/zzy/passwd, linenumber:10,columns:7,linecontent::x:11:0:operator:/root:/sbin/nologin
    filename:/home/zzy/passwd, linenumber:11,columns:7,linecontent:games:x:12:100:games:/usr/games:/sbin/nologin
    filename:/home/zzy/passwd, linenumber:12,columns:7,linecontent:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    filename:/home/zzy/passwd, linenumber:13,columns:7,linecontent:nobody:x:99:99:Nobody:/:/sbin/nologin
    filename:/home/zzy/passwd, linenumber:14,columns:7,linecontent:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    filename:/home/zzy/passwd, linenumber:15,columns:7,linecontent:dbus:x:81:81:System message bus:/:/sbin/nologin
    filename:/home/zzy/passwd, linenumber:16,columns:7,linecontent:polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    filename:/home/zzy/passwd, linenumber:17,columns:7,linecontent:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    filename:/home/zzy/passwd, linenumber:18,columns:7,linecontent:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    filename:/home/zzy/passwd, linenumber:19,columns:7,linecontent:chrony:x:998:996::/var/lib/chrony:/sbin/nologin
    filename:/home/zzy/passwd, linenumber:20,columns:7,linecontent:nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
    filename:/home/zzy/passwd, linenumber:21,columns:7,linecontent:tcpdump:x:72:72::/:/sbin/nologin
    filename:/home/zzy/passwd, linenumber:22,columns:7,linecontent:zzy:x:1000:1000::/home/zzy:/bin/bash
    filename:/home/zzy/passwd, linenumber:23,columns:7,linecontent:redis:x:997:992:Redis Database Server:/var/lib/redis:/sbin/nologin
    

案例

  • 截取出init中的PID号:

    [root@iZuf6g59pf51fzxynbonb1Z ~]# ps aux | grep init | grep -v grep | awk '{print $2}'
    2833
    
  • 截取网卡eth0的IPv4地址:

    [root@iZuf6g59pf51fzxynbonb1Z ~]# ifconfig eth0 | grep "inet"| awk '{print $2}'
    172.19.231.192
    
  • 取出vmstat 第四项的平均值:

    vmstat 1 4 | awk '{sum+=$4} END {print sum/4}'
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一切如来心秘密

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值