shell语言

标准格式

  1. 声明解释器
  2. 注释脚本功能、变量的含义等
  3. 无交互的可执行代码

执行脚本的方式

  1. 添加x执行权限:绝对路径或相对路径运行
  2. 使用bash命令:新开启一个子进程运行
  3. 使用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

  1. 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判断

  1. 单分支

if 条件测试;then

执行指令

fi

#条件测试每个字符串之间都要有空格

  1. 双分支

if 条件测试;then

执行指令1

else

执行指令2

fi

#条件测试每个字符串之间都要有空格

  1. 多分支

if 条件测试;then #条件测试每个字符串之间都要有空格

执行指令1 elif 条件测试;then

执行指令2

......

else

执行指令n #第n个指令

fi

for循环

可以定义多次反复执行某任务的工具,有次数的循环

for 变量名称 in 值1 值2 值3 ....

do

执行任务

done

编写pingIP地址通与不通的脚本

#!/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 终止当前循环,进行下一次循环

从键盘循环取整数(0结束)并求和,输出最终结果

#!/bin/bash x=0

while :

do

read -p "请输入数字(0是结束)" n [ $n -eq 0 ] && break

let x+=n

done

echo "一共是$x"

找出1~20以内6的倍数,并输出她的平方值

#!/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位随机密码

  1. 字符的替换

${变量名称/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替换为空,相当于删除

  1. 字串的删除

${变量名称#删除的内容} 掐头

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

  1. 设置变量的初值(备用值)

${变量名称:-初值}

编写脚本,用户配置密码时如果没有定义则使用123456

#!/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 流式编辑器

能够实现对文本非交互式的增删改查,逐行处理

  1. 使用方法:
    1. 前置命令 | 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

  1. 输出、打印文本

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

  1. 删除文本中每行的第2个字符与最后一个字符

sed 's/.//2;s/.$//' nssw #中间用分号隔开

  1. 将第一个字符和最后一个字符替换

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 #(.)任意字符,(.*)所有字符,不管长短

  1. 编写脚本,一键部署可以匿名上传的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 选项 (条件)指令

  1. 选项与指令

选项

指令

-F

print

#指定分隔符,可省略(默认空格或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的处理时机

  1. BEGIN{任务}
  2. {任务}
  3. 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

  1. awk的条件
  2. 使用正则:/正则/ ~ 包含 !~ 不包含

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}时,可以省略不写

  1. 使用数字或字符串

== != > < >= <=

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的,再输出第一

  1. 逻辑测试条件

&& 前后条件都匹配 || 前后条件匹配之一

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行

  1. 运算符

+

++

-

--

*

+=

/

-=

%

*=

/=

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,最后输出这些值

  1. awk数组

数组可以理解为能存储多个值的特殊变量使用方法 : 数组名[下标]=值

注:下标与值定义都比较自由

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

posted @ 2023-03-14 20:59  Lyful  阅读(33)  评论(0编辑  收藏  举报