[命令] Linux 命令 awk (打印文本的列)

内容目录:

内容一:awk 格式

内容二:选项
2.1 awk 的 -F 选项
2.2 awk 的 RS、ORS、FS、OFS 选项
2.3 awk 的 sub、gsub 选项
2.3.1 sub 和 gsub 的区别
2.3.2 sub 和 gsub 的格式
2.3.2.1 sub 的格式
2.3.2.2 gsub 的格式

内容三:awk 的常用内置变量

内容四: awk 的使用案例
4.1 案例一:awk 基础打印
4.1.1 打印文档第 1 列和第 3 列,但中间没有空格
4.1.2 打印文档第 1 列和第 3 列
4.1.3 打印文档第 1 列和第 3 列,但中间有很长的空格空间
4.1.4 打印倒数第 2 列
4.1.5 打印每一行的行号和列数
4.1.6 打印前一个命令结果的第 5 列
4.1.7 打印前一个命令结果的第 5 列
4.1.8 打印第 2 到最后 1 列
4.1.9 打印每行的行数、列数、第 1 列和最后 1 列,并且将冒号 “:” 视为分割符
4.1.10 打印第 1 列,这里的 \047 代表的是单引号 “’”,并且将冒号 “:” 视为分割符
4.2 案例二:awk 替换打印
4.2.1 将第 1 列为 root 的行的第 3 列替换成 “1” 后打印,并且将冒号 “:” 视为分割符
4.2.2 将全部横杠 “-” 替换成空值后打印
4.2.3 将全部横杠 “-” 替换成 3 个星号 “***” 后打印
4.2.4 给每一行前面添加行号后打印
4.2.5 以竖杠 “|” 作为分割符将第 2 列的数字去掉后打印
4.2.6 将句号 “.” 替换成换行符后打印
4.2.7 将换行符替换成句号 “.” 后打印
4.3 案例三:awk 变量
4.3.1 将 date 命令的运行结果,通过 getline 赋值给 d ,之后将 d 的值打印出来
4.3.2 将 eternalcenter 的值赋予给 content,并将 content 变量的值打印出来
4.4 案例四:awk 自定义分割列符号
4.4.1 将冒号 ”:“ 视为分割符
4.5 案例五:awk 打印常量
4.6 案例六:awk 使用正则表达式匹配
4.6.1 打印包含 Failed 的行的第 11 列
4.6.2 打印以 bash 结尾的行,并且将冒号 “:” 视为分割符
4.6.3 打印以 root 或者 adm 开头的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符
4.6.4 打印以 r 或者 a 开头的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符
4.6.5 打印第 1 列包含 root 的行,并且将冒号 “:” 视为分割符
4.6.6 打印第 7 列不以 nologin 结尾的行的第 1 列和第 7 列,并且将冒号 “:” 视为分割符
4.6.7 打印前一个命令包含 Rx p 的行的第 5 列
4.6.8 打印前一个命令以 / 结尾的行的第 4 列
4.6.9 打印第一列以两个数字结尾的行的第一列,并且将冒号 “:” 视为分割符
4.6.10 打印以 root 开头到以 mysql 开头的所有行的第 1 列,并且将冒号 “:” 视为分割符
4.7 案例七:awk 使用比较运算符匹配
4.7.1 打印行号等于 3 的行,并且将冒号 “:” 视为分割符
4.7.2 打印第 3 列数值等于 1000 的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符
4.7.3 打印第 3 列数值不等于 1000 的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符
4.7.4 打印第 3 列数值大于 1000 的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符
4.7.5 打印第 3 列数值小于 10 的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符
4.7.6 打印第 3 列数值大于 10 并且小于 20 的行,并且将冒号 “:” 视为分割符
4.7.7 打印第 3 列数值大于 1000 或者小于 10 的行,并且将冒号 “:” 视为分割符
4.7.8 打印第 3 列乘以第 4 列小于 100 的行,并且将冒号 “:” 视为分割符
4.7.9 打印第 1 列为 root 的行,并且将冒号 “:” 视为分割符
4.8 案例八:awk 计算
4.8.1 0 + 1 = 1
4.8.2 x = 0 + 1
4.8.3 x = 8 + 2
4.8.4 x = 8 – 1
4.8.5 2 + 3 = 5
4.8.6 2 * 3 = 6
4.8.7 3.2 + 3.5 = 6.7
4.8.8 23 除 8 余 7
4.8.9 打印第 3 加上 10 的结果,并且将冒号 “:” 视为分割符
4.8.10 找 200 以内 3 的倍数
4.8.11 找 100 以内 7 的倍数或者包含 7 的数
4.8.12 将第 4 列求和后打印,并且将冒号 “:” 视为分割符
4.9 案例九:awk 计数
4.9.1 计算以 bash 结尾的行数
4.9.2 计算第 3 列小于等于 1000 的行数,并且将冒号 “:” 视为分割符
4.9.3 计算 3 列大于 1000 的行数,并且将冒号 “:” 视为分割符
4.9.4 计算第 7 列以 bash 结尾的行数,并且将冒号 “:” 视为分割符
4.9.5 计算第 3 列和第 4 列的和赋值给变量,将变量的值打印出来,并且将冒号 “:” 视为分割符
4.9.6 计算第 1 列所有值各自总共出现的次数
4.9.7 统计此行中横杠 “-” 出现的次数并将第 4 列替换为次数
4.10 案例十:awk if 判断语句计数
4.10.1 计算第 3 列小于等于 1000 的行数和第 3 列大于 1000 的行数,并且将冒号 “:” 视为分割符
4.10.2 计算第 7 列以 bash 结尾的行数和第 7 列不以 bash 结尾的行数,并且将冒号 “:” 视为分割符
4.10.3 如果第 3 列等于 0 则打印 “root”,否则打印 “not root”,并且将冒号 “:” 视为分割符
4.10.4 如果第 3 列大于 1000 则打印第 3 列的值,否则打印 “system id”,并且将冒号 “:” 视为分割符
4.11 案例十一:awk for 循环实现同时批量输出值的名称和值
4.11.1 创建数组 a,其中 a[0]=0 a[1]=11 a[2]=22,并且将数组 a 打印出来
4.11.2 统计所有的 IP 地址以及每一个 IP 地址访问的次数
4.11.3 统计所有的 IP 地址以及每一个 IP 地址访问的次数,并以从多到少的顺序进行排序
4.11.4 将每一列的值前面加上所属行的行号,按行打印出来
4.11.5 将每一列的值前面加上所属行的行号,按行打印出来
4.12 案例十二:awk 打印表格

具体的内容:

内容一:awk 格式

# awk <option> '<condition>{<command>}' <file>
# awk <option> ' BEGIN{<option> <command>} {<command>} END{<command>}' <file>


补充:在这里
BEGIN{ } 里的指令只执行 1 次,并且是最先执行
{ } 里的指令会一行行地执行文件里的内容
END{ } 里指令只执行 1 次,并且是最后执行

内容二:选项
2.1 awk 的 -F 选项

awk 默认是以空格分割列,但是也可以通 -F 参数指定分割每一列的符号

2.2 awk 的 RS、ORS、FS、OFS 选项

RS 全名为 Record Separator 即指定记录分隔符
ORS 全名为 Output Record Separate 即指定输出记录分隔符
FS 全名为 Field Separator 即指定字段分隔符
OFS 全名为 Output Field Separator 即指定输出字段分隔符

2.3 awk 的 sub、gsub 选项
2.3.1 sub 和 gsub 的区别

sub 只匹配第一个字符串,类似于 sed ‘s//’
gsub 匹配所有字符串,类似于 sed ‘s//g’

2.3.2 sub 和 gsub 的格式
2.3.2.1 sub 的格式

# sub (<original string or regular expression>, <substitution string>):
# sub (<original string or regular expression>, <substitution string>, <target string>)

2.3.2.2 gsub 的格式

# gsub (<original string or regular expression>, <substitution string>):
# gsub (<original string or regular expression>, <substitution string>, <target string>)

内容三:awk 的常用内置变量

1) $0 文本当前行的全部内容
2) $1 文本的第 1 列
3) $2 文本的第 2 列
4) $3 文本的第 3 列

(补充:“$” 号后面的数字以此类推)

5) NR 文本当前行的行数,也就是目前处于第几行
6) NF 文本当前行的列数,也就是目前一共有几列
7) $(NF-1) 文本倒数第一列
8) $(NF-2) 文本倒数第二列
9) $(NF-3) 文本倒数第三列
10) , 代表空格
11) \t 代表 tab 制表位,就是比一个空格更多的空格

内容四: awk 的使用案例
4.1 案例一:awk 基础打印
4.1.1 打印文档第 1 列和第 3 列,但中间没有空格

# awk '{print $1,$3}' test.txt

(补充:这里的 test.txt 是要被 awk 操作的测试文件)

4.1.2 打印文档第 1 列和第 3 列

# awk '{print $1,$3}' test.txt

(补充:这里的 test.txt 是要被 awk 操作的测试文件)

4.1.3 打印文档第 1 列和第 3 列,但中间有很长的空格空间

# awk '{print $1,$3}' test.txt

(补充:这里的 test.txt 是要被 awk 操作的测试文件)

4.1.4 打印倒数第 2 列

# awk '{print $(NF-2)}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.1.5 打印每一行的行号和列数

# awk -F: '{print NR,NF}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.1.6 打印前一个命令结果的第 5 列

# df -h | awk '{print $5}'

4.1.7 打印前一个命令结果的第 5 列

# df -h / | tail -1 | awk '{print $5}'

4.1.8 打印第 2 到最后 1 列

# cat test.txt | awk '{$1="";print}' | sed -r 's/( )(.*)/\2/'


补充:
1)这里的 /etc/passwd 是要被 awk 操作的测试文件
2)这里的 $1=”” 是将第一设置为空
3)这里的 print 作用相当于 print $0

4.1.9 打印每行的行数、列数、第 1 列和最后 1 列,并且将冒号 “:” 视为分割符

# awk -F: '{print NR,NF,$1,$NF}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.1.10 打印第 1 列,这里的 \047 代表的是单引号 “’”,并且将冒号 “:” 视为分割符

# awk -F: '{print "\047 $1 \047"}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.2 案例二:awk 替换打印
4.2.1 将第 1 列为 root 的行的第 3 列替换成 “1” 后打印,并且将冒号 “:” 视为分割符

# awk -F: '$1=="root"{ $3 = '1';print  }' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.2.2 将全部横杠 “-” 替换成空值后打印

# echo "z m y z-m-y 2021-11-11 z:y" | awk 'gsub(/-/,"")'
z m y zmy 20211111 z:y

或者:

# echo eternal-center-zmy | awk 'BEGIN{ FS="-";}{print $1,$2,$3}'
eternal center zmy

4.2.3 将全部横杠 “-” 替换成 3 个星号 “***” 后打印

# echo eternal-center-zmy | awk 'BEGIN{ FS="-";OFS="***"}{print $1,$2,$3}'
eternal***center***zmy

4.2.4 给每一行前面添加行号后打印

# cat test.txt 
eternalcenter.com-ec-myz
eternalcentre.com-ec-myz
eternalcenter.org-ec-myz
eternalcentre.org-ec-myz

# awk 'BEGIN{ OFS="." }{ print NR,$0}' test.txt 
1.eternalcenter.com-ec-myz
2.eternalcentre.com-ec-myz
3.eternalcenter.org-ec-myz
4.eternalcentre.org-ec-myz

(补充:这里的 test.txt 是要被 awk 操作的测试文件)

4.2.5 以竖杠 “|” 作为分割符将第 2 列的数字去掉后打印

# cat test.txt 
eternalcenter.com|201901ec|com
eternalcentre.com|201902ec|com
zhumingyu.com|201903zmy|com
mingyuzhu.com|201904myz|com
eternalcenter.org|201905ec|org
eternalcentre.org|201906ec|org


# awk -F '|' 'BEGIN{ OFS="|" }{sub(/[0-9]+/,"",$2);print$0}' test.txt 
eternalcenter.com|ec|com
eternalcentre.com|ec|com
zhumingyu.com|zmy|com
mingyuzhu.com|myz|com
eternalcenter.org|ec|org
eternalcentre.org|ec|org

(补充:这里的 test.txt 是要被 awk 操作的测试文件)

或者:

# cat test.txt 
eternalcenter.com|201901ec|com
eternalcentre.com|201902ec|com
zhumingyu.com|201903zmy|com
mingyuzhu.com|201904myz|com
eternalcenter.org|201905ec|org
eternalcentre.org|201906ec|org

# awk -F '|' -v OFS='|' '{sub(/[0-9]+/,"",$2);print $0}' test.txt 
eternalcenter.com|ec|com
eternalcentre.com|ec|com
zhumingyu.com|zmy|com
mingyuzhu.com|myz|com
eternalcenter.org|ec|org
eternalcentre.org|ec|org

(补充:这里的 test.txt 是要被 awk 操作的测试文件)

4.2.6 将句号 “.” 替换成换行符后打印

# cat test.txt 
m.y.z

# awk 'BEGIN{RS=".";}{print $0}' test.txt 
m
y
z

(补充:这里的 test.txt 是要被 awk 操作的测试文件)

4.2.7 将换行符替换成句号 “.” 后打印

# cat test.txt 
m
y
z


# awk 'BEGIN{ORS=".";}{print $0}' test.txt 
m.y.z.

(补充:这里的 test.txt 是要被 awk 操作的测试文件)

4.3 案例三:awk 变量
4.3.1 将 date 命令的运行结果,通过 getline 赋值给 d ,之后将 d 的值打印出来

# awk 'BEGIN {"date"|getline d; print d}'

4.3.2 将 eternalcenter 的值赋予给 content,并将 content 变量的值打印出来

# content=eternalcenter

# awk '{print "$content"}'
content

# awk '{print '$content'}'
eternalcenter

(补充:awk 在使用变量时必须使用单引号 “’”,否则会把变量名称当作字符串)

4.4 案例四:awk 自定义分割列符号
4.4.1 将冒号 ”:“ 视为分割符

# awk -F: '{print $1,$7}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.4.2 将冒号 ”:“ 和句号 “.” 视为分割符

# awk -F [:.] '{print $1,$10}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.5 案例五:awk 打印常量

# awk -F: '{print $1,"的解释器是:",$7}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.6 案例六:awk 使用正则表达式匹配
4.6.1 打印包含 Failed 的行的第 11 列

# awk '/Failed/{print $11}' /var/log/secure

(补充:这里的 /var/log/secure 是要被 awk 操作的测试文件)

4.6.2 打印以 bash 结尾的行,并且将冒号 “:” 视为分割符

# awk -F: '/bash$/{print}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.6.3 打印以 root 或者 adm 开头的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符

# awk -F: '/^(root|adm)/{print $1,$3}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.6.4 打印以 r 或者 a 开头的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符

# awk -F: '/^[ra]/{print $1,$3}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.6.5 打印第 1 列包含 root 的行,并且将冒号 “:” 视为分割符

# awk -F: '$1~/root/' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.6.6 打印第 7 列不以 nologin 结尾的行的第 1 列和第 7 列,并且将冒号 “:” 视为分割符

# awk -F: '$7!~/nologin$/{print $1,$7}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.6.7 打印前一个命令包含 Rx p 的行的第 5 列

# ifconfig eth0 | awk '/RX p/{print $5}'

4.6.8 打印前一个命令以 / 结尾的行的第 4 列

# df -h | awk '/\/$/{print $4}'

4.6.9 打印第一列以两个数字结尾的行的第一列,并且将冒号 “:” 视为分割符

# awk -F: '$1 ~/[0-9][0-9]$/(print $1}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.6.10 打印以 root 开头到以 mysql 开头的所有行的第 1 列,并且将冒号 “:” 视为分割符

# awk -F '/^root/,/^mysql/{print $1}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.7 案例七:awk 使用比较运算符匹配
4.7.1 打印行号等于 3 的行,并且将冒号 “:” 视为分割符

# awk -F: 'NR==3{print}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.7.2 打印第 3 列数值等于 1000 的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符

# awk -F: '$3==1000{print $1,$3}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.7.3 打印第 3 列数值不等于 1000 的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符

# awk -F: '$3!=1000{print $1,$3}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.7.4 打印第 3 列数值大于 1000 的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符

# awk -F: '$3>=1000{print $1,$3}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.7.5 打印第 3 列数值小于 10 的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符

# awk -F: '$3<10{print $1,$3}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.7.6 打印第 3 列数值大于 10 并且小于 20 的行,并且将冒号 “:” 视为分割符

# awk -F: '$3>10 && $3<20' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.7.7 打印第 3 列数值大于 1000 或者小于 10 的行,并且将冒号 “:” 视为分割符

# awk -F: '$3>1000 || $3<10' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.7.8 打印第 3 列乘以第 4 列小于 100 的行,并且将冒号 “:” 视为分割符

# awk -F: '$3 * $4 <100' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.7.9 打印第 1 列为 root 的行,并且将冒号 “:” 视为分割符

# awk -F: '$1=="root"' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.8 案例八:awk 计算
4.8.1 0 + 1 = 1

# awk 'BEGIN{print x+1}'

(注意:这里的 x 可以不定义,直接用,默认值为 0)

4.8.2 x = 0 + 1

# awk 'BEGIN{x++;print x}'

(注意:这里的 x 可以不定义,直接用,默认值为 0)

4.8.3 x = 8 + 2

# awk 'BEGIN{x=8;print x+=2}'

(注意:这里的 x 可以不定义,直接用,默认值为 0)

4.8.4 x = 8 – 1

# awk 'BEGIN{x=8;x--;print x}'

(注意:这里的 x 可以不定义,直接用,默认值为 0)

4.8.5 2 + 3 = 5

# awk 'BEGIN{print 2+3}'

4.8.6 2 * 3 = 6

# awk 'BEGIN{print 2*3}'

4.8.7 3.2 + 3.5 = 6.7

# awk 'BEGIN{print 3.2+3.5}'

4.8.8 23 除 8 余 7

# awk 'BEGIN{ print 23%8}'

4.8.9 打印第 3 加上 10 的结果,并且将冒号 “:” 视为分割符

# awk -F: '$3 + 10' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.8.10 找 200 以内 3 的倍数

# seq 200 | awk '$1%3==0'

4.8.11 找 100 以内 7 的倍数或者包含 7 的数

# seq 100 | awk '$1%7==0||$1~/7/'

4.8.12 将第 4 列求和后打印,并且将冒号 “:” 视为分割符

# awk -F: 'BEGIN{total=0}{total+=$4}END{print total}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.9 案例九:awk 计数
4.9.1 计算以 bash 结尾的行数

# awk 'BEGIN{x=0}/bash$/{x++} END{print x}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.9.2 计算第 3 列小于等于 1000 的行数,并且将冒号 “:” 视为分割符

# awk -F: '{if($3<=1000){i++}}END{print i}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.9.3 计算 3 列大于 1000 的行数,并且将冒号 “:” 视为分割符

# awk -F: '{if($3>1000){i++}}END{print i}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.9.4 计算第 7 列以 bash 结尾的行数,并且将冒号 “:” 视为分割符

# awk -F: '{if($7~/bash$/){i++}}END{print i}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.9.5 计算第 3 列和第 4 列的和赋值给变量,将变量的值打印出来,并且将冒号 “:” 视为分割符

# awk -F: '{result=$3+$4; printf result}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.9.6 计算第 1 列所有值各自总共出现的次数

# awk '{a[$1]++}END{for(i in a){print i,a[$i]}}' /usr/local/nginx/logs/access.log

(补充:这里的 /usr/local/nginx/logs/access.log 是要被 awk 操作的测试文件)

4.9.7 统计此行中横杠 “-” 出现的次数并将第 4 列替换为次数

# echo "z- m y 2021-11-11 z:y" | awk '$4=gsub(/-/,"")'
z m y 3 z:y

4.10 案例十:awk if 判断语句计数
4.10.1 计算第 3 列小于等于 1000 的行数和第 3 列大于 1000 的行数,并且将冒号 “:” 视为分割符

# awk -F: '{if($3<=1000){i++}else{j++}}END{print i,j}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.10.2 计算第 7 列以 bash 结尾的行数和第 7 列不以 bash 结尾的行数,并且将冒号 “:” 视为分割符

# awk -F: '{if($7~/bash$/){i++}else{j++}} END{print i,j}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.10.3 如果第 3 列等于 0 则打印 “root”,否则打印 “not root”,并且将冒号 “:” 视为分割符

# awk -F: '{print ($3=0 ? "root": not root)}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.10.4 如果第 3 列大于 1000 则打印第 3 列的值,否则打印 “system id”,并且将冒号 “:” 视为分割符

# awk -F: 'BEGIN{max=1000}{id=($3>max ?$3 :"system id");print id}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.11 案例十一:awk for 循环实现同时批量输出值的名称和值
4.11.1 创建数组 a,其中 a[0]=0 a[1]=11 a[2]=22,并且将数组 a 打印出来

# awk 'BEGIN{a[0]=0;a[1]=11;a[2]=22; for(i in a){print i,a[i]}}'

4.11.2 统计所有的 IP 地址以及每一个 IP 地址访问的次数

# awk '{ip[$1]++} END{for(i in ip) {print i,ip[i] }}' /var/log/httpd/access_log


补充:
1) 这里的 /var/log/httpd/access_log 是要被 awk 操作的测试文件
2) 这里以统计 /var/log/httpd/access_log 文件里第一列的 IP 地址为例

4.11.3 统计所有的 IP 地址以及每一个 IP 地址访问的次数,并以从多到少的顺序进行排序

# awk '{ip[$1]++} END{for(i in ip) {print i,ip[i] }}' /var/log/httpd/access_log | sort -k2nr


补充:
1) 这里的 /var/log/httpd/access_log 是要被 awk 操作的测试文件
2) 这里以统计 /var/log/httpd/access_log 文件里第一列的 IP 地址为例

4.11.4 将每一列的值前面加上所属行的行号,按行打印出来

# awk -F: '{ i=1;while(i<NF) {print NR,$i;i++}}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.11.5 将每一列的值前面加上所属行的行号,按行打印出来

# awk '{ for(i=1;i<NF;i++)  {print NR,$i}}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

4.12 案例十二:awk 打印表格

在开始打印一行,在结尾打印一行,并且将 “:” 视为分割符

# awk -F: 'BEGIN{print "User\tUID\tHome"}{print $1 "\t"  $3  "\t"  $6}END{print "Total",NR,"lines."}' /etc/passwd

(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)

[排错] Linux 解决取消挂载目录时报错 “target is busy” 或者 “device is busy”

报错代码:

(1)target is busy
(2)device is busy

解决方法:

步骤目录:

步骤一:取消挂载时可能出现的报错

步骤二:查看要被取消挂载的目录正在被哪个进程使用
2.1 方法一:使用 fuser 命令查看此目录正在被哪个进程使用
2.1.1 安装 psmisc
2.1.2 查看要取消挂载的目录正在被哪个进程使用
2.2 方法二:使用 lsof 命令查看此目录正在被哪个进程使用

步骤三:杀死正在使用此目录的进程

步骤四:此时就可以取消挂载了

具体的操作步骤:

步骤一:取消挂载时可能出现的报错

当取消某一个目录的挂载时,出现以下报错,则说明此目录可能正在被使用:

(1)当使用 umount 命令时出现类似 “umount: /xxx: target is busy.” 等字样
(2)当使用 umount 命令时出现类似 “umount: /xxx: device is busy.” 等字样

步骤二:查看要被取消挂载的目录正在被哪个进程使用

(注意:以下两种方法二选一执行即可)

2.1 方法一:使用 fuser 命令查看此目录正在被哪个进程使用
2.1.1 安装 psmisc

# yum install psmisc

2.1.2 查看要取消挂载的目录正在被哪个进程使用

# fuser -mv /mnt/
                     USER        PID ACCESS COMMAND
/mnt:                root     kernel mount /mnt
                     root      11111 ..c.. bash

2.2 方法二:使用 lsof 命令查看此目录正在被哪个进程使用

# lsof /mnt/
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash    11111 root  cwd    DIR   3,16       51   128 /mnt

步骤三:杀死正在使用此目录的进程

# kill -9 11111

步骤四:此时就可以取消挂载了

# umount /mnt/

[实验] Nginx 源码软件包的安装

纪念:站主于 2019 年 9 月完成了此开源实验,并将过程中的所有命令经过整理和注释以后,形成以下教程

软件准备:

在 Nginx 官网上下载搭建集群所需软件 Nginx:

http://nginx.org/en/download.html

正文:

步骤目录:

步骤一:系统环境要求

步骤二:安装 Nginx 的依赖软件

步骤三:安装 Nginx
3.1 添加一个用于启动 Nginx 的用户身份
3.2 解压 Nginx 安装包
3.3 进入 Nginx 安装包目录
3.4 配置 Nginx
3.5 编译并安装 Nginx

步骤四:测试 Nginx
4.1 启动 Nginx
4.2 访问 Nginx 实现的网页服务
4.3 查看已安装 Nginx 的版本

具体的操作步骤:

步骤一:系统环境要求

(1)服务器的系统需要是 CentOS 7 版本
(2)服务器系统需要有 yum 源

步骤二:安装 Nginx 的依赖软件

# yum -y install gcc pcre-devel openssl-devel

步骤三:安装 Nginx
3.1 添加一个用于启动 Nginx 的用户身份

# useradd -s /sbin/nologin nginx

3.2 解压 Nginx 安装包

# tar -xvf nginx-1.16.1.tar.gz

(补充:这里要安装的 Nginx 版本是 1.16.1)

3.3 进入 Nginx 安装包目录

# cd nginx-1.16.1

(补充:这里要安装的 Nginx 版本是 1.16.1)

3.4 配置 Nginx

# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module

3.5 编译并安装 Nginx

# make && make install

步骤四:测试 Nginx
4.1 启动 Nginx

# /usr/local/nginx/sbin/nginx

4.2 访问 Nginx 实现的网页服务

# curl 127.0.0.1

4.3 查看已安装 Nginx 的版本

# /usr/local/nginx/sbin/nginx -V