变量
定义变量
定义变量=
左右不能加空格:
[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
-
使用
ifconfig
和sed
组合来列出特定网卡的 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
用法举例
-
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/`
-
-
结合正则表达式替换
原文件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
-
在配置.conf文件时,为相邻的几行添加# 号
第31到36行开头添加#:
sed -i '31,36 s/^/#/' test.txt
去掉第31到36行开头#
sed -i '31,36 s/^#// test.txt'
-
利用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调用方式
-
命令行方式
awk [-F field-separator] 'commands' filename
- command是真正的awk命令
- [-F域分隔符] 是可选的,由域分隔符分开的每一项都称为一个域。在不指名域的情况下,默认的域分隔符是空格。
- filename是待处理的文件
-
使用"-f" 选项调用awk程序
可以将awk程序写入一个文件,然后在awk命令行中用"-f"选项调用并执行这段程序:
awk -f awk文件名 filename
,filename为待处理文件。 -
利用命令解释器调用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脚本编写
-
awk的内置变量
- ARGC: 命令行参数个数。
- ARGV: 命令行参数排列。
- ENVIRON: 支持队列中系统环境变量的使用。
- FNR: 浏览文件的记录数。
- FS:设置输入域分隔符,等价于命令行“-F”。
- RS: 输入行分隔符。
- NF:浏览记录域的个数(分隔后的字段个数)。
- NR:已读的记录数(行数)。
- OFS:输出域分隔符。
- ORS:输出行分隔符。
$0
指整条记录。$1
表示当前行的第一个域。$2
表示当前行的第二个域。 -
pattern/action模式
针对匹配的行执行action:
- 判断当前是不是空格:
/^$/ {print "this is a blank"}
- 判断第五个字段是不是含有"MA":
$5 ~ /MA/ {print $1 "," $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}'`
-
-
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}'