shell语言
标准格式
- 声明解释器
- 注释脚本功能、变量的含义等
- 无交互的可执行代码
执行脚本的方式
- 添加x执行权限:绝对路径或相对路径运行
- 使用bash命令:新开启一个子进程运行
- 使用source命令:使用当前解释器运行
变量
自定义变量
变量名称=变量的值(=两边没有空格)
变量名可使用英文大小写,数字,下划线组成不能使用特殊符号,不能以数字开头
环境变量
env 显示所有环境变量,与查找连用
set 显示所有变量,与查找连用
环境变量 含义
USER 当前登录的用户名
HOSTNAME 当前系统主机名
HOME 用户的家目录
PWD 当前所在路径
UID 用户的uid
SHELL 当前登录的解释器
PS1 一级提示符 [\u@\h \W]$
PS2 二级提示符
RANDOM 随机生成0~32767之间的整数数字
$1 #执行脚本后的第一个参数
$0 #显示脚本或程序的名称
$# #统计所有位置参数的个数
$* #显示所有参数
$$ #显示进程PID号
$? #返回上一条命令的状态值 0为正常 其它异常
变量扩展
双引号 "" ,界定字符串范围
touch a b #创建2个文件
touch “a b” #创建一个文件
单引号 ' ' ,界定字符串范围,可屏蔽特殊符号
a=10 #定义一个变量
echo "$a" #输出10 echo '$a' #输出$a
反撇号 ``,得到命令的执行结果
a=`date`
echo $a #输出为date的执行结果
read命令
从键盘获取变量的值,-p:给出提示信息创建用户名及密码的脚本,不显示密码
#!/bin/bash
read -p "请输入用户名" a useradd $a
stty -echo
read -p "请输入密码" p stty echo
#屏蔽回显
#恢复回显
echo $p | passwd --stdin $a
全局变量
普通定义的变量是局部变量
发布全局变量可以在任何解释器中使用格式:export 变量名
shell运算方法
1.
expr #运算符号两边需要空格 支持变量 expr $a + 1 |
||
expr |
1 |
- $a |
expr |
2 |
\* 2 #乘法,需用转义符号\屏蔽*的特殊含义 |
expr |
2 |
/ 2 |
expr |
5 |
% 2 #求模,取余数 |
2.
echo $[a+1] #支持变量
echo $[a/b]
3.
let #运算结果不显示,通常针对变量使用,创建变量,可以修改变
量的值
a=10
b=20
let c=a+b #创建变量c,值是10+20 echo $c #变量c=30
let c=20-a #修改现有变量c的值echo $c #变量c=10
一般写法 主流写法
let c=c+1 let c++
let c=c-1 let c--
let c=c+2 let c+=2
let c=c 2 let c =2
- bc计算器,可进行小数运算
echo "1+1" | bc #非交互式使用bc
echo "1.1+1" | bc
echo "10/3" | bc
echo "scale=3;10/3" | bc #scale=数字,表示输出小数点后几位数
条件测试
使脚本具备智能判断的工具
方法1:test 表达式方法2:[表达式]
操作符 含义
-z 字符串的值为空
-n 字符串的值不为空(相当于!-z)
== 两个字符串相同
!= 两个字符串不同
整数值
操作符 含义
-eq 等于(Equal)
-ne 不等于(Not Equal)
-gt 大于(Greater Than)
-lt 小于(Lesser Than)
-ge 大于或等于(Greater or Equal)
-le 小于或等于(Lesser or Equal)
文件状态
操作符 含义
-e 判断对象是否存在(Exist),若存在则为真
-d 判断对象是否为目录(Directory),是则为真
-f 判断对象是否为一般文件(File),是则为真
-r 判断对象是否有可读(Read)权限,有则为真
-w 判断对象是否有可写(Write)权限,有则为真
-x 判断对象是否有可执行(eXcute)权限,有则为真
组合多个条件
操作符 含义
&& 并且 ,符号前面的任务执行成功后才执行后面的任务
|| 或者 ,符号前面的任务执行失败后才执行后面的任务
if判断
- 单分支
if 条件测试;then
执行指令
fi
#条件测试每个字符串之间都要有空格
- 双分支
if 条件测试;then
执行指令1
else
执行指令2
fi
#条件测试每个字符串之间都要有空格
- 多分支
if 条件测试;then #条件测试每个字符串之间都要有空格
执行指令1 elif 条件测试;then
执行指令2
......
else
执行指令n #第n个指令
fi
for循环
可以定义多次反复执行某任务的工具,有次数的循环
for 变量名称 in 值1 值2 值3 ....
do
执行任务
done
#!/bin/bash x=0
y=0
for i in {1..15} do
ping -c 3 -i 0.2 -W 1 172.25.0.$i &> /dev/null # -c
测试次数 -i 间隔时间 -W 测试失败后反馈时间
if [ $? -eq 0 ];then
echo "172.25.0.$i通了"
let x++
else
echo "172.25.0.$i不通" let y++
fi
done
echo "$x台通了,$y台不通"
while循环
无次数限制
while 条件测试
do
执行指令
done
while : #表示无限循环
case分支
功能类似if,不如if强大,比if精简
case 变量 in
模式1)
命令序列1 ;;
模式2)
命令序列2 ;;
.. ..
*)
默认命令序列
esac
使用case分支编写控制nginx的脚本:
#!/bin/bash case $1 in
on)
/usr/local/nginx/sbin/nginx ;; #开启nginx服务off)
/usr/local/nginx/sbin/nginx -s stop ;; #关闭服务
st)
netstat -ntulp | grep -q nginx #查看服务是否开启
[ $? -eq 0 ] && echo "服务开启" || echo "服务未开启" ;;
re)
/usr/local/nginx/sbin/nginx -s stop
/usr/local/nginx/sbin/nginx ;;
*)
echo "on | off | st | re" esac
注:netstat -ntulp | grep :80 查询80端口被什么服务占用
echo -e "\033[31m字符串\033[0m" 改变字体颜色
控制循环命令
命令 含义
Exit 终止循环的同时也终止了脚本
break 终止循环,继续执行循环后的任务
continue 终止当前循环,进行下一次循环
#!/bin/bash x=0
while :
do
read -p "请输入数字(0是结束)" n [ $n -eq 0 ] && break
let x+=n
done
echo "一共是$x"
#!/bin/bash
for i in {1..20} do
x=$[i%6]
[ $x -eq 0 ] || continue echo $[i*i]
done
字符串处理
字符的截取:
${变量名:起始位置:长度}
a=abcdef
#定义变量,起始位置从0开始
echo ${a:1:2} #截取变量a的值,从第2位开始截取,一共截取2位
获取8位随机密码
#!/bin/bash
a=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123 456789 #定义变量
for i in {1..8} #执行语句循环8次
do
x=$[RANDOM%62] #定义x变量从0-61
p=${a:x:1} #截取a的值,从第x位开始,截取1位pa=$pa$p #循环一次追加赋值一次
done
echo $pa #输出8位随机密码
${变量名称/old/new}
a=aabbcc
#定义一个变量
echo ${a/a/b} #替换1个a为b
echo ${a//a/b} #替换所有a为b echo ${a/aa/bb} #替换aa为bb
echo ${a/aa/} #将aa替换为空,相当于删除
${变量名称#删除的内容} 掐头
a=`head -1 /etc/passwd` #创建变量
echo ${a#root} #从左往右删除到第一个root echo ${a##*root} #从左往右删除到最后一个root
${变量名称%删除的内容} 去尾
a=`head -1 /etc/passwd` #创建变量
echo ${a%root*} #从右往左删除到第一个root以及root右边所有echo ${a%%root*} #从右往左删除到最后一个root
批量修改文件扩展名的脚本
#!/bin/bash
for i in `ls *.txt` do
x=${i%.*} mv $i $x.doc
done
#优化后#!/bin/bash
for i in `ls *.$1` do
x=${i%.*} mv $i $x.$2
done
${变量名称:-初值}
#!/bin/bash
read -p "请输入用户名" n useradd $n
read -p "请输入密码" p
echo ${p:-123456}| passwd --stdin $n
函数
将公共的语句块存储在一个函数名中,达到精简脚本,增加可读性的目的
#格式1:
function 函数名 {
命令序列
.. ..
}
#格式2:
函数名 () {
命令序列
.. ..
}
正则表达式
基本正则
正则符号 描述信息
正则符号 描述信息
^ 匹配行首
$ 匹配行尾
[] 集合,匹配集合中的任意单个字符
[^] 对集合取反
. 匹配任意单个字符
匹配前一个字符的任意次数,不可单独使用
\{n,m\} 匹配前一个字符n到m次
\{n\} 匹配前一个字符n次
\{n,\} 匹配前一个字符n次及n次以上
\(\) 保留
扩展正则
正则符号 描述信息
+ 最少匹配一次
? 最多匹配一次
{n,m} 匹配前一个字符n到m次
() 保留
| 或者
\b 单词边界,可用\>代替
Grep过滤工具
选项 描述
-i 忽略字母大小写
-e 支持扩展正则,可简写egrep
-v 取反
-c 统计匹配的行数
-q 静默、无任何输出,一般用于检测
-n 显示出匹配结果所在的行号
--color 标红显示匹配字串
sed 流式编辑器
能够实现对文本非交互式的增删改查,逐行处理
sed 选项 '条件+编辑指令' 文档
选项 描述
-n 屏蔽默认输出
-r 支持扩展正则,若与其他选项一起使用,应作为首选项
-i 直接修改文件内容
操作指令
操作符 |
用途 |
示例 |
p |
打印行 |
2p 输出第2行 |
d |
删除行 |
2d 删除第2行 |
s |
字符串替换 |
s/old/new/ 将每行的第一个old替换为new |
i |
行前插入文本 |
2iYY 在第二行之前添加文本YY |
a |
行后插入文本 |
2aYY 在第二行之后添加文本YY |
c |
替换当前行 |
2cYY 将第2行的内容修改为YY |
sed sed |
-n -n |
'p' user '1p' a.txt |
#输出所有文档的内容, 没有默认的输出 #输出文档的第一行 |
sed |
-n |
'1,3p' a.txt |
#输出1~3行 |
sed |
-n |
'2p;5p' a.txt |
#输出第2行和第5行 |
sed |
-n |
'2,+1p' a.txt |
#输出第2行以及后面的1行 |
sed |
-n |
'1~2p' a.txt |
#输出第1行之后每间隔一行再输出 |
sed |
-n |
'2~2p' a.txt |
#输出第2行之后每间隔一行再输出 |
sed |
-n |
'/^bin/p' a.txt |
#输出以bin开头的行 |
sed |
-n |
'=' a.txt |
#查看行号 |
sed |
-n |
'$=' a.txt |
#查看最后一行行号 |
sed |
-n |
'$p' user |
#查看最后一行 |
删除文本
不加-i选项只做输出,不修改文件
sed '1d' a.txt
#删除第一行
sed '1,3d' a.txt #删除1~3行
sed '3,+2d' a.txt #删除第3行以及后面2行
sed '1d;5d' a.txt #删除第一行和第5行
替换文本
sed 's/old/new/'
sed 's/2017/XXXX/' test
#替换,替换符/可更换
#替换所有行的第一个2017为XXXX
sed 's/2017/XXXX/2' test #替换所有行的第2个
sed '1s/2017/XXXX/' test #替换第1行的第一个2017
sed 's/2017/XXXX/g' test #替换所有行的所有2017
- 删除文本中每行的第2个字符与最后一个字符
sed 's/.//2;s/.$//' nssw #中间用分号隔开
- 将第一个字符和最后一个字符替换
sed -r 's/(a)(b)(c)/\1\2\3/' abc #保留之后按原顺序粘贴
sed -r 's/(a)(b)(c)/\3\2\1/' abc #更换顺序
sed -r 's/(.)(.)(.)/\3\2\1/' abc #使用正则符号增加匹配范围sed -r 's/^(.)(.*)(.)$/\3\2\1/' abc #(.)任意字符,(.*)所有字符,不管长短
- 编写脚本,一键部署可以匿名上传的ftp服务
#!/bin/bash
yum -y install vsftpd #安装vsftpd
sed -i 's/#anon_u/anon_u/' /etc/vsftpd/vsftpd.conf #修改配置文件
systemctl restart vsftpd
systemctl enable vsftpd
chmod 777 /var/ftp/pub #为共享文件夹添加权限
awk 精确搜索
使用方法
1, awk 选项 (条件)指令 被处理的文件
2, 前置指令 | awk 选项 (条件)指令
选项
指令
-F
#指定分隔符,可省略(默认空格或tab位)
内置变量
变量 用途
FS 保存或设置字段分隔符,例如:FS=":",与-F一样
$n 指定分隔的第n个字段,$1表示第一列
$0 当前读入的整行文本内容
NR 行数
NF 列数
awk '{print}' test awk '{print $1}' test
awk '{print $1 $2}' test awk '{print $0}' test awk '{print $1,$0}' test
awk -F/ '{print $3}' user
#输出所有行
#输出所有行的第1列
#输出所有行的第1列第2列t #输出所有列
#输出第一列后 再输出所有列
#使用/做分隔符,输出第3列
awk -F[:/] '{print $9}' user #使用:或/做分隔符,输出第9列
awk -F: '{print $1"的解释器是"$7}' user #变量+常量组合输出,常量用""引起来
df -h | awk '/vda1/{print "当前主机根分区可用空间是 "$4}' ifconfig eth0 |awk '/RX p/{print "当前主机eth0的接收流量是"$5"字节"}'
ifconfig eth0 |awk '/TX p/{print "当前主机eth0的发送流量是"$5"字节"}'
如何输出 "主机内存剩余空间是XXX"
free -h |awk '/^Mem/{print "主机内存剩余空间是"$4}'
主机内存剩余空间是93M
/var/log/secure
#安全日志路径
awk '/Failed/{print $11}' /var/log/secure #在安全日志中查
找访问本机密码输入失败的主机ip
awk的处理时机
- BEGIN{任务}
- {任务}
- END{任务}
#开始时执行1次
#逐行任务,执行N次
#结束时执行1次
example:
awk 'BEGIN{x=10;print x}' user #定义变量,然后输出变量,执行1次awk '{x=10;print x}' user #执行多次
awk 'END{x=10;print x}' user #执行1次
awk 'BEGIN{print NR}' user
显示0
awk 'END{print NR}' user
显示最后一行的行号
#显示行号,由于在逐行任务之前,
#显示行号,由于在逐行任务之后,
awk 'BEGIN{x=0}{x++}END{print x}' user #先定义变量,然后每一
行将这个变量+1,最后输出变量的值
\t #相当于tab,具有一定的排版功能,制表符,是常量awk -F: 'BEGIN{print "User\tUID\tHOME"}{print
$1"\t"$3"\t"$6}END{print "总计"NR"行"}' user
awk '/^root/{print}' user
awk '/^root|^bin/{print}' user awk -F: '$1~/root/{print}' user
#基本正则匹配
#扩展正则匹配
#找第1列包含root的行
awk -F: '$1!~/root/{print}' user #找第1列不包含root的行
awk -F: '$1!~/root/' user #任务仅仅是{print}时,可以省略不写
- 使用数字或字符串
== != > < >= <=
awk 'NR==2{print}' user awk 'NR==2' user
awk 'NR<4' user
awk 'NR<=3' user
#输出第2行
#简写,效果同上#找1~3行
#效果同上
awk -F: '$1=="root"{print}' user #找第1列必须等于root的
awk -F: '$1~/root/{print}' user #找第1列包含root的awk -F: '$1!="root"{print}' user #找第1列不等于root的awk -F: '$3==0{print}' user #找uid等于0的
awk -F: '$3==0{print $1}' user #找uid等于0的,再输出第一
列
- 逻辑测试条件
&& 前后条件都匹配 || 前后条件匹配之一
awk -F: '$3>=1000&&$3<2000' /etc/passwd 1000并且小于2000的
awk -F: '$3<10||$3>1000' /etc/passwd
或者大于1000的
awk -F: '$3<10&&$3>1000' /etc/passwd
没有
awk 'NR>=2&&NR<=4' user
#找uid是大于等于
#找uid是小于10
#逻辑错误,什么都#找2~4行
- 运算符
+
++
-
--
*
+=
/
-=
%
*=
/=
awk 'NR%2==1{print}}' a.txt #输出奇数行文本
awk 'BEGIN{i=0}{i+=NF}END{print i}' a.txt #统计文本的总字段个数
seq 200 | awk 'BEGIN{i=0}($0%3==0)&&($0%13==0)
{i++}END{print}' #计算能同时被3和13整除的整数个数
awk中的if判断
awk -F: '{if($3<10){x++}}END{print x}' user #使用单分支,
如果第3列小于10,就把x+1,最后输出x的值
awk -F: '{if($3>=1000){x++}}END{print x}' /etc/passwd #
使用单分支
awk -F: '{if($3>=1000){x++}else{y++}}END{print x,y}'
/etc/passwd #使用双分支, 如果第3列大于等于10,把x+1,否则y+1, 最后输出x和y的值
awk -F: '{if($1~/root/){x++}else{y++}}END{print x,y}'
/etc/passwd #如果第1列包含root,把x+1,否则y+1,最后输出这些值
数组可以理解为能存储多个值的特殊变量使用方法 : 数组名[下标]=值
注:下标与值定义都比较自由
awk 'BEGIN{a[1]=100;a[2]=200;print a[1]}' #定义两个数组,并
输出其中一个
awk 'BEGIN{a[1]=100;a[2]=200;print a[2]}'
awk 'BEGIN{a[88]=100;a[2]=200;print a[1]}' #下标不存在,无任何输出
awk 'BEGIN{a[88]=100;a[2]=200;print a[88]}' #修改了下标,输出时也修改
awk 'BEGIN{abc["a"]=100;abc["b"]="xyz";print
abc["a"],abc["b"]}' #下标和值不仅可以用数字, 其他字符也可以,但要加双引号
awk 'BEGIN{abc["192.168.0.1"]=100;abc["192.168.0.2"]="xyz";pri
nt abc["192.168.0.2"]}'
awk数组与for循环遍历数组
for(变量名称 in 数组名称){执行指令}
for循环在遍历数组时的变量名称是数组的下标,而不是值!
awk 'BEGIN{abc[1]=10;abc[2]=20;for(i in abc){print i }}' #定义数组abc,分别有2个下标和2个值,然后交给for循环输出下标
awk 'BEGIN{abc[1]=10;abc[2]=20;for(i in abc){print abc[i]
}}' #定义数组abc,分别有2个下标和2个值,然后交给for循环输出值awk 'BEGIN{abc[1]=10;abc[2]=20;for(i in abc){print i,abc[i] }}' #下标和值都输出
[root@server0 opt]# cat abc abc
abc xyz opq abc
opq
awk '{a[$1]++}END{for(i in a){print i}}' abc #使用awk数组
+for循环, 显示abc中不同的行
awk '{a[$1]++}END{for(i in a){print i,a[i]}}' abc #使用awk数组+for循环, 显示abc中不同的行以及这行出现了几次
[root@server0 opt]# cat abc abc 192.168.0.10
abc 192.168.0.10
xyz 192.168.0.20
opq 192.168.0.30
abc 192.168.0.10
opq 192.168.0.30
awk '{ip[$2]++}END{for(i in ip){print i,ip[i]}}' abc #输出同一ip的出现次数
使用awk统计网站访问量:
1,安装httpd服务
yum -y install httpd 2,开启服务,将防火墙临时关闭
systemctl restart httpd
systemctl stop firewalld
3,使用其他主机访问该网站,每次访问的记录会存在网站日志中curl http://172.25.0.11
4,查看/var/log/httpd/access_log保存了客户的访问记录tail -1 curl http://172.25.0.11
5,使用awk统计访问次数
awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' access_log #统计次数,以及访问者的ip
awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' access_log | sort -n -r #统计次数,以及访问者的ip,并排序
sort命令可以用来排序 -n是以数字排序 -r是降序
ab -n 1000 -c 1 http://172.25.0.11/
-n 访问次数,-c 并发访问量 #增加访问记录,然后在使用awk输出信息查看
编写监控脚本
#!/bin/bash while :
do
uptime |awk '{print "cpu的平均负载是"$10 , $11 ,$12}' ifconfig eth0 |awk '/RX p/{print "主机eth0网卡的接收流量是"$5"字节"}'
ifconfig eth0 |awk 'NR==7{print "主机eth0网卡的发送流量是"$5"字节"}'
free -h |awk '/Mem/{print "主机内存剩余容量是"$4}' df -h | awk '/vda1/{print "主机根分区 剩余容量是"$4}'
awk 'END{print "计算机的用户数量是"NR"个"}' /etc/passwd uptime | awk '{print "当前登录用户数量是" $6}'
p=`ps aux | wc -l`
echo "主机运行的进程数量是$p个" m=`rpm -qa | wc -l`
echo "本机已经安装的软件包数量是$m个" sleep 3 #睡眠3秒
clear #清屏done
编写脚本, 监控主机,当有人尝试访问本机输入密码失败超过3次后发邮件通知管理员
#!/bin/bash
x=`awk '/Failed/{ip[$11]++}END{for(i in ip){print ip[i]","i} }' /var/log/secure` #先使用awk找出次数,ip for l in $x #将找出的次数与ip交给for循环
do
h=${l%,*} #去尾,得到次数p=${l#*,} #掐头,得到ip
[ $h -gt 3 ] && echo "$p访问本机输入密码错误$h次" | mail -s test root #如果次数大于3,发邮件把ip通知管理员
done
sort排序
sort可针对文本文件的内容,以行为单位来排序。不加选项,默认升序
选项 描述
-b 从第一个可见字符开始比较,忽略每行前面开始出的空格字符。
-c
会检查文件是否已排好序,如果乱序,则输出第一个乱序的行的相关信息,最后返回1
-d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
-f 排序时,将小写字母视为大写字母。
-i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。
-m 将几个排序好的文件进行合并。
-M 将前面3个字母依照月份的缩写进行排序。比如JAN小于FEB 等等
-n 依照数值的大小排序。
-o 将排序后的结果存入指定的文件。
-r 以相反的顺序来排序。
-t<分隔字符> 指定排序时所用的栏位分隔字符。
+<起始栏位>-<结 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏束栏位> 位。
--version 显示版本信息
--help 显示帮助。
-u 在输出行中去除重复行。
-k 指定列数
-h 按照文件大小倒序显示
[root@zhoucentos log]# cat date 2017-12-02
2017-01-09
2017-10-23
2017-04-24
[root@zhoucentos log]# sort -n -k 2 -t'-' date 2017-01-09
2017-04-24
2017-10-23
2017-12-02
uniq命令
uniq 不会检查重复的行,除非它们是相邻的行。
选项 描述
-c 在每行前加上表示相应行目出现的重复次数
-d 只输出重复的行
-D 显示所有重复的行
-u 只显示唯一的行
-i 忽略大小写字符的不同;
cut命令
cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut是以每一行为一个处理对象的,这种机制和sed是一样的
选项 描述
-d 后面接分隔字符。与 -f 一起使用;
-f 依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思;
-c 以字符 (characters) 的单位取出固定字符区间;
[root@www ~]# echo $PATH
/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bi n:/usr/games
# 1 : 2 : 3 : 4 : 5 : 6 : 7
将 PATH 变量取出,我要找出第五个路径。
[root@www ~]#echo $PATH | cut -d ':' -f 5
/usr/local/bin
将 PATH 变量取出,我要找出第三和第五个路径。
#echo $PATH | cut -d ':' -f 3,5
/sbin:/usr/local/bin
将 PATH 变量取出,我要找出第三到最后一个路径。
echo $PATH | cut -d ':' -f 3-
/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games
将 PATH 变量取出,我要找出第一到第三个路径。
#echo $PATH | cut -d ':' -f 1-3
/bin:/usr/bin:/sbin:
实用例子:只显示/etc/passwd的用户和shell #cat /etc/passwd | cut -d ':' -f 1,7 root:/bin/bash
daemon:/bin/sh bin:/bin/sh
wc命令
统计文件里面有多少单词,多少行,多少字符。
选项 描述
-l 统计行数
-w 统计单词出现次数
-m 统计文件的字节数
#wc /etc/passwd
40 45 1719 /etc/passwd
节数
#40是行数,45是单词数,1719是字
#wc -l /etc/passwd #统计行数,在对记录数时,很常用
40 /etc/passwd #表示系统有40个账户
#wc -w /etc/passwd #统计单词出现次数
45 /etc/passwd
#wc -m /etc/passwd #统计文件的字节数1719