Hello World

Your description here.

shell

后端 2 评

shell

格式要求

脚本以#!/bin/bash 开头

有可执行权限

执行常用方式:

方式一:

​ 1) 赋予脚本权限:chmod 744 shell.sh

​ 2) 执行脚本 :./shell.sh

方式二:

​ sh shell.sh

shell变量

Linux Shell 中的变量分为,系统变量和用户自定义变量。

系统变量:常见的
    $HOME用户家目录
    $PWD
    $SHELL显示当前shell类型
    $USER
    $ID
    $TERM:打印当前终端类型
    HOSTNAME:显示当前主机名
    $0:当前脚本的名称
    $n:当前脚本的第n个参数,n=1,2,…,9

变量定义

定义变量:变量=值
撤销变量:unset 变量

[root@hello xian]# A=100
[root@hello xian]# echo $A
100
[root@hello xian]# unset A
[root@hello xian]# echo $A

声明静态变量:readonly 变量,注意:不能 unset
定义变量的规则
1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
2)等号两侧不能有空格
3)变量名称一般习惯为大写

将命令的返回值赋给变量(重点)
1)A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量 A
2)A=$(ls -la) 等价于反引号

[root@hello xian]# echo `ls-l /home`
[root@hello xian]# RESULT=`ls -la /home`
[root@hello xian]# echo $RESULT
total 16 drwxr-xr-x. 4 root root 4096 Aug 20 17:23 . dr-xr-xr-x. 19 root root 4096 Aug 31 11:23 .. drwx------ 2 useradd useradd 4096 Aug 20 17:23 useradd drwxr-xr-x 2 root root 4096 Aug 20 15:39 xian_add

设置环境变量

17.5.1 基本语法

1) export 变量名=变量值 (功能描述:将 shell 变量输出为环境变量)

2) source 配置文件 (功能描述:让修改后的配置信息立即生效)

3) echo $变量名 (功能描述:查询环境变量的值)

位置参数变量

​ 当我们执行一个 shell 脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量,比如 : ./myshell.sh 100 200 , 这个就是一个执行 shell 的命令行,可以在 myshell 脚本中获取到参数信息

$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@(功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
$#(功能描述:这个变量代表命令行中所有参数的个数)
$0 命令本身

#! /usr/bin/bash
echo "$0 $1 $2"
echo "$*"
echo "$@"
echo "参数个数=$#"

image-20200831160644185

预定义变量:就是 shell 设计者事先已经定义好的变量,可以直接在 shell 脚本中使用

$$ 当前进程的进程号(PID))

$! 后台运行的最后一个进程的进程号(PID))

$?最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令

#!/bin/bash
echo "dang qian=$$"
#后台运行
./myshell.sh &
echo "最后的进程好=$!"
echo "最后执行的值=$?"

运算符

1) “$((运算式))”或“$[运算式]”

2) expr m + n 注意 expr 运算符间要有空格

3) expr m - n

4) expr *, /, % 乘,除,取余

RESULT=$(((2+3)*4))
echo "RESULT=$RESULT"

RESULT2=$[(2+3)*4]
echo "RESULT2=$RESULT2"

TEMP=`expr 2 + 3`
RESULT3=`expr $TEMP \* 4`
echo "result3=$RESULT3"

SUM=$[$1+$2]
echo "SUM=$SUM"

条件判断

1)两个整数的比较
= 字符串比较
-lt 小 于
-le 小于等于
-eq 等 于
-gt 大 于
-ge 大于等于
-ne 不等于
2) 按照文件权限进行判断
-r 有读的权限  [ -r  文件  ] 注意空格
-w 有写的权限
-x 有执行的权限
3)按照文件类型进行判断
-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在并是一个目录
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
elif [条件判断式]
then
程序
fi

(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格 (2) 推荐使用第二种方式

#!/bin/bash
if [ $1 -ge 60 ]
then
        echo "ji ge"
elif [ $1 -lt 60 ]
then
        echo "no no no"
fi
case $变量名 in
"值 1")
如果变量的值等于值 1,则执行程序 1
;;
"值 2")
如果变量的值等于值 2,则执行程序 2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序

;;
esac

#!/bin/bash
case $1 in
"1")
echo "周一"
;;
"2")
echo "zhou er"
;;
*)
echo "other"
;;
esac
# 方式一
for 变 量 in 值 1 值 2 值 3…
do
程序
done

for i in "$@"
do
        echo "the num is $i"
done


#方式二
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done

SUM=0
for((i=1;i<=100;i++))
do
    SUM=$[$SUM+$i]
done
echo "sum=$SUM"
while [ 条件判断式 ]
do
程序
done

#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
        SUM=$[$SUM+$i]
        i=$[$i+1]
done
echo "sum=$SUM"

read 读取控制台输入

read(选项)(参数)

选项:

​ -p:指定读取值时的提示符;

​ -t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。

参数

​ 变量:指定读取值的变量名

#!/bin/bash

# 读取控制台输入一个num
read -p "清输入num1=" NUM1
echo "你输入的值是num1=$NUM1"

read -t 10 -p "清输入一个num2=" NUM2
echo "输入的值是$NUM2"

函数

shell 编程和其它编程语言一样,有系统函数,也可以自定义函数。系统函数中,我们这里就介绍两个。

• basename 基本语法

功能:返回完整路径最后 / 的部分,常用于获取文件名

basename [pathname] [suffix]

basename [string] [suffix] (功能描述:basename 命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。

选项:

suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉。

[root@hello xian]# basename /home/home1
home1
[root@hello xian]# basename /home/home1.txt
home1.txt
[root@hello xian]# basename /home/home1.txt txt
home1.
[root@hello xian]# basename /home/home1.txt .txt
home1

• dirname 基本语法

功能:返回完整路径最后 / 的前面的部分,常用于返回路径部分

dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))

[root@hello xian]# dirname /home/aaa/text/txt.txt
/home/aaa/text

自定义函数

• 基本语法

[ function ] funname[()]

{

Action; [return int;]

}

调用直接写函数名:funname [值],不需要写形参

function getsum(){
SUM=$[$n1+$n2]
echo "heshi=$SUM"
}

read -p "输入第一个" n1
read -p "输入第二个" n2

getsum $n1 $n2

Shell 编程综合

需求分析

1)每天凌晨 2:10 备份 数据库 atguiguDB 到 /data/backup/db

2)备份开始和备份结束能够给出相应的提示信息

3)备份后的文件要求以备份时间为文件名,并打包成 .tar.gz 的形式,比如:

2018-03-12_230201.tar.gz

3) 在备份的同时,检查是否有 10 天前备份的数据库文件,如果有就将其删除。

1、请按照这样的日期格式(xxxx-xx-xx)每日生成一个文件,例如今天生成的文件为2017-07-05.log, 并且把磁盘的使用情况写到到这个文件中,(不用考虑cron,仅仅写脚本即可)!

#! /bin/bash
d=`date +%F`
logfile=$d.log
df -h > $logfile

命令

awk

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大

awk 更是一门编程语言,支持条件判断、数组、循环等功能
awk options pattern {action} file
常用acion为print和printf
[root@hello xian]# which awk
/usr/bin/awk
[root@hello xian]# ls -l /usr/bin/awk
lrwxrwxrwx. 1 root root 4 Mar  7  2019 /usr/bin/awk -> gawk
[root@hello xian]# cat 1.text
q1 q2 q3
21 22 23
31 32 33
41 42 43
#执行 awk '{print $2}',没有使用参数和模式,$2是表示输出文本的第二列,信息默认空格为分隔符,多个空格也被识别为一个
[root@hello xian]# awk '{print $1}' 1.text
q1
21
31
41
#$0 整行数据输出
[root@hello xian]# awk '{print $0}' 1.text
q1 q2 q3
21 22 23
31 32 33
41 42 43
#倒数第一列 $NF
[root@hello xian]# awk '{print $NF}' 1.text
q3
23
33
43
#倒数第一列 $NF-1
[root@hello xian]# awk '{print $(NF-1)}' 1.text
q2
22
32
42

awk按行处理,一行处理完毕后处理下一行,根据用户指定的分隔符去工作,没有指定则默认空格

image-20200901165732636.png

image-20200901170019443.png

[root@hello xian]# cat -n 1.text
     1  q1 q2 q3
     2  21 22 23
     3  31 32 33
     4  41 42 43
[root@hello xian]# awk '{print $1 $2 $3}' 1.text
q1q2q3
212223
313233
414243
# 加,为默认空格分隔符
[root@hello xian]# awk '{print $1, $2, $3}' 1.text
q1 q2 q3
21 22 23
31 32 33
41 42 43

awk必须外层单引号,内层双引号

内置变量不得加双引号,比如$1,$2

[root@hello xian]# awk '{print "第一列:" $1, "第二列:"$2,"第三列:" $3}' 1.text
第一列:q1 第二列:q2 第三列:q3
第一列:21 第二列:22 第三列:23
第一列:31 第二列:32 第三列:33
第一列:41 第二列:42 第三列:43

#整行输出
[root@hello xian]# awk '{print }' 1.text
q1 q2 q3
21 22 23
31 32 33
41 42 43

[root@hello xian]# awk '{print $0}' 1.text
q1 q2 q3
21 22 23
31 32 33
41 42 43

[root@hello xian]# awk '{print "每一行的内容是"$0}' 1.text
每一行的内容是q1 q2 q3
每一行的内容是21 22 23
每一行的内容是31 32 33
每一行的内容是41 42 43

awk 参数

-F:指定分隔符

-v:定义或修改一个awk内部变量

-f:从脚本文件中读取awk命令

# awk '模式{动作}' 文件

[root@hello xian]# awk 'NR==2{print $0}' 1.text
21 22 23

[root@hello xian]# awk 'NR==1,NR==3{print $0}' 1.text
q1 q2 q3
21 22 23
31 32 33
# 输出带行号
[root@hello xian]# awk '{print NR,$0}' 1.text
1 q1 q2 q3
2 21 22 23
3 31 32 33
4 41 42 43
# 显示第二行到第三行并且带行号
[root@hello xian]# awk 'NR==2,NR==3{print NR,$0}' 1.text
2 21 22 23
3 31 32 33
# 显示第一列 倒数第一列 倒数第二列
[root@hello xian]# awk '{print $1,$(NF-1),$NF}' 1.text
q1 q2 q3
21 22 23
31 32 33
41 42 43

FS输入分隔符

awk分隔符有两种

  • 输入分隔符,默认空格,field separator,变量名FS
  • 输出分隔符,out field separator,简称OFS
[root@hello xian]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.21.0.16  netmask 255.255.240.0  broadcast 172.21.15.255
        inet6 fe80::5054:ff:fe43:fef  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:43:0f:ef  txqueuelen 1000  (Ethernet)
        RX packets 41959579  bytes 3271111210 (3.0 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 42684862  bytes 5790998740 (5.3 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@hello xian]# ifconfig eth0 | awk 'NR==2{print $0}'
        inet 172.21.0.16  netmask 255.255.240.0  broadcast 172.21.15.255
[root@hello xian]# ifconfig eth0 | awk 'NR==2{print}'
        inet 172.21.0.16  netmask 255.255.240.0  broadcast 172.21.15.255
[root@hello xian]# ifconfig eth0 | awk 'NR==2{print $2}'
172.21.0.16


[root@hello xian]# cat /etc/passwd > 1.txt
[root@hello xian]# cat 1.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin

# 以:分割输出第一列
[root@hello xian]# awk -F ":" '{print $1}' 1.txt
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
# 以:分割输出第一列
[root@hello xian]# awk -v FS=":" '{print $1}' 1.txt
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
# 修改输出分隔符
[root@hello xian]# awk -v FS=":" -v OFS="====" '{print $1,$NF}' 1.txt
root====/bin/bash
bin====/sbin/nologin
daemon====/sbin/nologin
adm====/sbin/nologin
lp====/sbin/nologin
sync====/bin/sync
shutdown====/sbin/shutdown
halt====/sbin/halt
mail====/sbin/nologin
operator====/sbin/nologin
games====/sbin/nologin
ftp====/sbin/nologin
# NR 行号,NF每一行的字段数
[root@hello xian]# awk -v FS=":" -v OFS=" " '{print NR,NF,$NF}' 1.txt
1 7 /bin/bash
2 7 /sbin/nologin
3 7 /sbin/nologin
4 7 /sbin/nologin
5 7 /sbin/nologin
6 7 /bin/sync
7 7 /sbin/shutdown
8 7 /sbin/halt
9 7 /sbin/nologin

awk变量

内置变量

FS:输入字段分割符
OFS:输出字段分隔符
RS:输入换行符
ORS:输出换行符
NF:字段数量
NR:行数
FNR: 各文件分别计数的行数
FILENAME:当前文件名
ARGC:命令行参数个数
ARGV:数组,保存命令行给定参数

awk内置变量NR,NF是不需要添加$,但取列数需要添加$

#FNR 分别显示不同文件的行号
[root@hello xian]# awk '{print FNR,$0}' 1.text 1.txt
1 q1 q2 q3
2 21 22 23
3 31 32 33
4 41 42 43
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
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

#RS
[root@hello xian]# awk -v RS=" " '{print NR,$0}' 1.text
1 q1
2 q2
3 q3
21
4 22
5 23
31
6 32
7 33
41
8 42
9 43
#ORS
[root@hello xian]# awk -v ORS="换行"  '{print NR,$0}' 1.text
1 q1 q2 q3换行2 21 22 23换行3 31 32 33换行4 41 42 43换行
#filename
[root@hello xian]# awk '{print FILENAME,FNR,$0}' 1.text 1.txt
1.text 1 q1 q2 q3
1.text 2 21 22 23
1.text 3 31 32 33
1.text 4 41 42 43
1.txt 1 root:x:0:0:root:/root:/bin/bash
1.txt 2 bin:x:1:1:bin:/bin:/sbin/nologin
1.txt 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
1.txt 4 adm:x:3:4:adm:/var/adm:/sbin/nologin
#awk 输出前 N 列的最简单方法
[root@hello xian]# awk -v FS=":" -v OFS=" " '{NF=4}1' 1.txt
root x 0 0
bin x 1 1
daemon x 2 2
adm x 3 4
lp x 4 7
sync x 5 0
[root@hello xian]# awk -v FS=":" -v OFS=" " '{NF=NF}1' 1.txt
root x 0 0 root /root /bin/bash
bin x 1 1 bin /bin /sbin/nologin
daemon x 2 2 daemon /sbin /sbin/nologin
adm x 3 4 adm /var/adm /sbin/nologin
lp x 4 7 lp /var/spool/lpd /sbin/nologin
sync x 5 0 sync /sbin /bin/sync
shutdown x 6 0 shutdown /sbin /sbin/shutdown
halt x 7 0 halt /sbin /sbin/halt
mail x 8 12 mail /var/spool/mail /sbin/nologin
operator x 11 0 operator /root /sbin/nologin
games x 12 100 games /usr/games /sbin/nologin
[root@hello xian]# awk 'BEGIN{print "start start oooooh"}{print ARGV[0] ,ARGV[1]}' 1.text
start start oooooh
awk 1.text
awk 1.text
awk 1.text
awk 1.text
[root@hello xian]# awk 'BEGIN{print "start start oooooh"}{print ARGV[0] ,ARGV[1],ARGV[2]}' 1.text 1.txt
start start oooooh
awk 1.text 1.txt
awk 1.text 1.txt
awk 1.text 1.txt
awk 1.text 1.txt
awk 1.text 1.txt
awk 1.text 1.txt
awk 1.text 1.txt
awk 1.text 1.txt
awk 1.text 1.txt
awk 1.text 1.txt
awk 1.text 1.txt
awk 1.text 1.txt
awk 1.text 1.txt
awk 1.text 1.txt
awk 1.text 1.txt
awk 1.text 1.txt

自定义变量

方式一:-v varName=value

方式二:在程序中直接定义

[root@hello xian]# awk -v bianliang="zheshige" 'BEGIN{print "变量是",bianliang}'
变量是 zheshige
[root@hello xian]# awk 'BEGIN{bian1="变量1";bian2="百年改良";print bian1,bian2}'
变量1 百年改良
[root@hello xian]# awk -v myVar=$bian1 'BEGIN{print myVar}'
变量1

awk格式化输出

printf:文本格式化输出

# printf 格式化输出不带换行符
[root@hello xian]# awk '{print $0}' 1.text
q1 q2 q3
21 22 23
31 32 33
41 42 43
[root@hello xian]# awk '{printf $0}' 1.text
q1 q2 q321 22 2331 32 3341 42 43[root@hello xian]#

[root@hello xian]# awk '{printf "%s\n", $0}' 1.text
q1 q2 q3
21 22 23
31 32 33
41 42 43
[root@hello xian]# printf "%d\n" 1 23
1
23

[root@hello xian]# awk 'BEGIN{printf "%d\n%d\n",1,2,3,4}'
1
2

[root@hello xian]# awk 'BEGIN{printf "%d\n%d\n%d----\n",1,2,3,4}'
1
2
3----
[root@hello xian]# awk '{printf "第一列:%s, 第二列:%s\n",$1,$2}' 1.text
第一列:q1, 第二列:q2
第一列:21, 第二列:22
第一列:31, 第二列:32
第一列:41, 第二列:42
# -左对齐,25表示长度
[root@hello xian]# awk '{printf "第一列:%-25s\t 第二列:%-25s\n",$1,$2}' 1.text
第一列:q1                                第二列:q2
第一列:21                                第二列:22
第一列:31                                第二列:32
第一列:41                                第二列:42

awk模式

BEGIN:处理文本前的动作

END:结束之后执行的动作

[root@hello xian]# awk 'BEGIN{print "begin 了"}{print $0}END{print "jieshu 了"}' 1.text
begin 了
q1 q2 q3
21 22 23
31 32 33
41 42 43
jieshu 了
[root@hello xian]# awk 'NR==2{print $0}' 1.text
21 22 23
[root@hello xian]# awk 'NR<2{print $0}' 1.text
q1 q2 q3
[root@hello xian]# awk 'NR<3{print $0}' 1.text
q1 q2 q3
21 22 23

[root@hello xian]# awk 'NR!=3{print $0}' 1.text
q1 q2 q3
21 22 23
41 42 43
# 输出2到4行
[root@hello xian]# awk 'NR==2,NR==4{print $0}' 1.text
21 22 23
31 32 33
41 42 43


[root@hello xian]# grep "games" 1.txt
games:x:12:100:games:/usr/games:/sbin/nologin
# awk  '/正则/动作' file
[root@hello xian]# awk '/^games/{print $0}' 1.txt
games:x:12:100:games:/usr/games:/sbin/nologin

[root@hello xian]# awk -F ":" '/^games/{print $1,$NF}' 1.txt
games /sbin/nologin

[root@hello xian]# grep /sbin/nologin 1.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@hello xian]# awk '/\/nologin/{print $0}' 1.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

# 统计日志访问ip数量
#uniq -c 去重显示次数
#sort -n 从大到小排序
#head -number 取前number
[root@hello log]# awk '{print $1}' yum.log | sort -n | uniq | wc -l

[root@hello log]# awk '{print $1}' yum.log | sort -n | uniq -c
     65 Aug
      8 Feb
     20 Jan
[root@hello log]# awk '{print $1}' yum.log | sort -n | uniq -c | sort -n
      8 Feb
     20 Jan
     65 Aug
[root@hello log]# awk '{print $1}' yum.log | sort -n | uniq -c | sort -nr
     65 Aug
     20 Jan
      8 Feb

[root@hello log]# awk '{print $1}' yum.log | sort -n | uniq -c | sort -nr |head -2
     65 Aug
     20 Jan
#练习
#1.打印所有普通用户的家目录(/etc/passwd)
[root@hello log]# awk -F ":" '$3>=1000{print $1,$(NF-1)}' /etc/passwd
xian_add /home/xian_add
useradd /home/useradd

#2.给文件添加#
[root@hello xian]# awk 'NR<6{print "#",$0}' 1.text
# q1 q2 q3
# 21 22 23
# 31 32 33
# 41 42 43

#取出电话号码
[root@hello xian]# cat 1.text
mi1 ha:[510] 777-999:350:450:100:175
mi2 ha:[510] 777-999:350:450:100:175

mi3 ha:[510] 777-999:350:450:100:175
mi4 ha:[510] 777-999:350:450:100:175
mi5 ha:[510] 777-999:350:450:100:175
mi6 ha:[510] 777-999:350:450:100:175
mi7 ha:[510] 777-999:350:450:100:175
mi8 ha:[510] 777-999:350:450:100:175
mi9 ha:[510] 777-999:350:450:100:175
mi10 ha:[510] 777-999:350:450:100:175
mi11 ha:[510] 777-999:350:450:100:175
mi12 ha:[510] 777-999:350:450:100:175
mi13 ha:[510] 777-999:350:450:100:175
mi14 ha:[510] 777-999:350:450:100:175

[root@hello xian]# awk -F "[ :]" '{print $4}' 1.text
777-999
777-999

777-999
777-999
777-999
777-999
777-999
777-999
777-999
777-999
777-999
777-999
777-999
777-999
[root@hello xian]# awk -F "[ :]" '!/^$/{print $4}' 1.text
777-999
777-999
777-999
777-999
777-999
777-999
777-999
777-999
777-999
777-999
777-999
777-999
777-999
777-999
# 找出mi9的电话号码
[root@hello xian]# awk -F"[ :]" '/^mi9/{print $1,$4}' 1.text
mi9 777-999
# 找出第二列以D开头的
# 匹配正则 x~/正则/
[root@hello xian]# awk -F"[ :]" '$2~/^D/{print $2}' 1.text
#匹配第三列是916的

重定向符

\> 输出覆盖重定向,当文件不存在时会生成文件

\>> 输出追加重定向,标准输入stdin,代码为0,当文件不存在时会生成文件

< << 标准输入重定向,标准输出stdout,代码为1

2>或>> 标准错误输出stderr,代码为2

#1. 读取文件内容,写入到另一个文件中
[root@hello xian]# cat 2.txtx
cat: 2.txtx: No such file or directory
[root@hello xian]# cat 1.text > 2.txt
[root@hello xian]# ls
1.text  1.txt  2.txt  expr.sh  for.sh  if2.sh  if.sh  myshell.sh  test.sh
#2. 将文本内容拆分成多行
xargs

[root@hello xian]# xargs -n 2 <  1.text
mi1 ha:[510]
777-999:350:450:100:175 mi2
ha:[510] 777-999:350:450:100:175
mi3 ha:[510]
777-999:350:450:100:175 mi4
ha:[510] 777-999:350:450:100:175
mi5 ha:[510]
777-999:350:450:100:175 mi6
ha:[510] 777-999:350:450:100:175
mi7 ha:[510]

#3. 输入

[root@hello xian]# cat > 1.txt <<EOF
> shan  shang
> dier
> nonono
> EOF

cat命令

读取文件内容
-n 显示每一行行号
-E 每行结束都有$
-S 不输出多行空行
多个文件合并 cat 1.txt 2.txt > 3.txt
非交互式编辑或者追加内容 cat >> 1.txt <<EOF    EOF
清空文件 cat /dev/null > 1.txt

cut命令

切割文本
-c 以字符进行切割,
-d 自定义分隔符,默认tab
-f 与-d一起使用,指定显示哪个区域
[root@hello xian]# cut -c 4-7 1.text
 ha:
 ha:
 ha:
 ha:
[root@hello xian]# cut -c 5,7 1.text
h:
h:
h:
# 重头取第7个
[root@hello xian]# cut -c -7 1.text
mi1 ha:
mi2 ha:
# 从第8个字符往后切割
[root@hello xian]# cut -c 8- 1.text
[510] 777-999:350:450:100:175
[510] 777-999:350:450:100:175
# 自定义切割符
[root@hello xian]# cut -d ":" -f 3 1.text
350
350
[root@hello xian]# cut -d ":" -f 1-3 1.text
mi1 ha:[510] 777-999:350
mi2 ha:[510] 777-999:350
[root@hello xian]# cut -d ":" -f 1- 1.text
mi1 ha:[510] 777-999:350:450:100:175
mi2 ha:[510] 777-999:350:450:100:175

sort

将输入文件按规则排序

-n 根据字符串从小到大排序

-r 逆序

-u 去重排序

-t指定分隔符

-k选择区域

# 根据分隔符进行排序
[root@hello xian]# cat 1.txt
10.0.0.1
10.0.0.23
10.0.0.4
10.0.0.212
10.0.0.1
10.0.0.44
# -t指定分隔符 -k选择区域
[root@hello xian]# sort -t "." -k 4 -n 1.txt
10.0.0.1
10.0.0.1
10.0.0.4
10.0.0.23
10.0.0.44
10.0.0.212
[root@hello xian]# sort -t "." -k 4 -nu 1.txt
10.0.0.1
10.0.0.4
10.0.0.23
10.0.0.44
10.0.0.212

uniq :去除重复连续的行

[root@hello xian]# cat 1.txt
10.0.0.1
10.0.0.23
10.0.0.4
10.0.0.212
10.0.0.1
10.0.0.44
[root@hello xian]# uniq 1.txt
10.0.0.1
10.0.0.23
10.0.0.4
10.0.0.212
10.0.0.1
10.0.0.44
[root@hello xian]# sort -n 1.txt | uniq
10.0.0.1
10.0.0.212
10.0.0.23
10.0.0.4
10.0.0.44
# 只统计了重复的行 -d --repeatd
[root@hello xian]# sort -n 1.txt | uniq -d
10.0.0.1
# 每行出现次数 -c --count
[root@hello xian]# sort -n 1.txt | uniq -c
      2 10.0.0.1
      1 10.0.0.212
      1 10.0.0.23
      1 10.0.0.4
      1 10.0.0.44
# -u --uniq 只出现了一次的行
[root@hello xian]# sort -n 1.txt | uniq -u
10.0.0.212
10.0.0.23
10.0.0.4
10.0.0.44

wc

统计文件行数、单词数、字节数

-c --bytes 打印字节数

-m --chars 打印字符数

-l --lines 打印行数

-L --max-line-length 打印最长行的长度

-w --words 打印单词数

# 行数
[root@hello xian]# wc -l 1.txt
6 1.txt
# 单词数
[root@hello xian]# echo 'diyi er dan si' | wc -w
4
# 还有$
[root@hello xian]# echo 123 | wc -m
4
[root@hello xian]# cat 1.txt | wc -L
10

tr

从标准输入中替换、缩减或删除字符,将结果写入到标准输出

tr [option] set1 set2

-d 删除set1

# 替换标准输入的大小写
[root@hello xian]# echo 'hello world' | tr '[a-z]' '[A-Z]'
HELLO WORLD

[root@hello xian]# echo 'hello world' | tr -d 'e'
hllo world
# 把文件作为标准替换
[root@hello xian]# tr 10 110 < 1.txt
11.1.1.1
11.1.1.23
11.1.1.4
11.1.1.212
11.1.1.1
11.1.1.44
# 去除连续字符
[root@hello xian]# echo 111222223222 | tr -s '123'
1232

grep

global search regular expression and print out the line

grep option pattern file

-i ignorecase 忽略大小写

-o 仅显示匹配到的字符串本身

-v --invert-match 显示不能被匹配到的行

-E 支持使用扩展正则表达式

-q --quiet 不输出任何信息

-c 只统计匹配行数

-w 只匹配过滤的单词

[root@hello xian]# grep -ni "root" 1.txt
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
[root@hello xian]# grep -ic "root" 1.txt
2
# 找除了空行
[root@hello xian]# cat 1.text
mi1 ha:[510] 777-999:350:450:100:175
mi2 ha:[510] 777-999:350:450:100:175

mi3 ha:[510] 777-999:350:450:100:175
mi4 ha:[510] 777-999:350:450:100:175
mi5 ha:[510] 777-999:350:450:100:175



mi6 ha:[510] 777-999:350:450:100:175
mi7 ha:[510] 777-999:350:450:100:175



mi8 ha:[510] 777-999:350:450:100:175


mi9 ha:[510] 777-999:350:450:100:175
mi10 ha:[510] 777-999:350:450:100:175



mi18 ha:[510] 777-999:350:450:100:175
[root@hello xian]# grep -n '^$' 1.text
3:
7:
8:
9:
12:
13:
14:
16:
17:
20:
21:
22:
[root@hello xian]# grep -nv '^$' 1.text
1:mi1 ha:[510] 777-999:350:450:100:175
2:mi2 ha:[510] 777-999:350:450:100:175
4:mi3 ha:[510] 777-999:350:450:100:175
5:mi4 ha:[510] 777-999:350:450:100:175
6:mi5 ha:[510] 777-999:350:450:100:175
10:mi6 ha:[510] 777-999:350:450:100:175
11:mi7 ha:[510] 777-999:350:450:100:175
15:mi8 ha:[510] 777-999:350:450:100:175
18:mi9 ha:[510] 777-999:350:450:100:175
19:mi10 ha:[510] 777-999:350:450:100:175
23:mi18 ha:[510] 777-999:350:450:100:175
# 找以.结尾的
[root@hello xian]# grep -n '\.$' 1.text
10:mi6 ha:[510] 777-999:350:450:100:175.
11:mi7 ha:[510] 777-999:350:450:100:175.
[root@hello xian]# grep -n "/bin/bash$" 1.txt
1:root:x:0:0:root:/root:/bin/bash
28:xian_add:x:1000:1001::/home/xian_add:/bin/bash
29:useradd:x:1500:1500::/home/useradd:/bin/bash
[root@hello xian]# grep -n "/bin/bash$" 1.txt -o
1:/bin/bash
28:/bin/bash
29:/bin/bash
#. 匹配一个字符
[root@hello xian]# grep -n ".ome" 1.txt
25:syslog:x:996:994::/home/syslog:/bin/false
28:xian_add:x:1000:1001::/home/xian_add:/bin/bash
29:useradd:x:1500:1500::/home/useradd:/bin/bash
# * 找出0次或者多次

[root@hello xian]# grep "xian_*" 1.txt
xian_add:x:1000:1001::/home/xian_add:/bin/bash

[root@hello xian]# echo "my number is 1234567" |  grep "[^1-4]"
my number is 1234567
[root@hello xian]# echo "my number is 1234567" |  grep "[1-4]" -o
1
2
3
4
[root@hello xian]# echo "my number is 1234567" |  grep -E "n+"
my number is 1234567
# 匹配前面字符0次或者一次
[root@hello xian]# cat test.txt
gooooooooood
god
gd
goooood

[root@hello xian]# grep -E "go?d" test.txt
god
gd

# | 或
[root@hello xian]# cat 1.text
12345
234
3456
1789
[root@hello xian]# grep -E "3|4" 1.text
12345
234
3456

# ()分组

[root@hello xian]# grep -E "g(o|la)d" test.txt
god
glad

#{n,m}最少匹配n次,最多m次
[root@hello xian]# grep -E "o{2,6}" test.txt
gooooooooood
goooood
[root@hello xian]# grep -E "o{2,6}" test.txt -o
oooooo
oooo
ooooo
#练习题
# 在/etc/passwd 包含root用户的行
[root@hello xian]# grep "^root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
# 匹配以root开头或yu开头的行
[root@hello xian]# grep -E "^(root|yu)" /etc/passwd
root:x:0:0:root:/root:/bin/bash
#匹配不以root开头的行的数量
[root@hello xian]# grep "^root" /etc/passwd -vc
29
# -m 最多匹配次数
[root@hello xian]# grep "^root" /etc/passwd -v -m 2
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#匹配多个文件
grep -l "root" pwd.txt pwd2.txt test.txt
# 显示/etc/passwd文件中不以/bin/
[root@hello xian]# grep "/bin/bash$" 1.txt -vn
2:bin:x:1:1:bin:/bin:/sbin/nologin
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:libstoragemgmt:x:998:997:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
18:rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
19:ntp:x:38:38::/etc/ntp:/sbin/nologin
20:abrt:x:173:173::/etc/abrt:/sbin/nologin
21:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
22:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
23:chrony:x:997:995::/var/lib/chrony:/sbin/nologin
24:tcpdump:x:72:72::/:/sbin/nologin
25:syslog:x:996:994::/home/syslog:/bin/false
26:openvpn:x:995:993:OpenVPN:/etc/openvpn:/sbin/nologin
27:nginx:x:994:992:Nginx web server:/var/lib/nginx:/sbin/nologin
30:tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
# 匹配2位数或者3位数 < > 定位单词左边或者右边
[root@hello xian]# grep -E "\<[0-9]{2,3}\>" 1.txt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
libstoragemgmt:x:998:997:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
syslog:x:996:994::/home/syslog:/bin/false
openvpn:x:995:993:OpenVPN:/etc/openvpn:/sbin/nologin
nginx:x:994:992:Nginx web server:/var/lib/nginx:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
# 找出文件中至少一个空白字符开头,后面是非空字符的行
[root@hello xian]# grep "^[[:space:]].*" 1.text
    这是个测试文本1
 hello world
[root@hello xian]# grep -E "^[[:space:]]+[^[:space:]]" 1.text
    这是个测试文本1
 hello world
# 找所有大小写i开头的行
[root@hello xian]# grep  -E "^[[:space:]]*(i|I)" 1.text
   i 这是个测试文本1
 I hello world

[root@hello xian]# grep  -Ei "^[[:space:]]*i" 1.text
   i 这是个测试文本1
 I hello world

[root@hello xian]# grep  -Ei "^[[:space:]]*[iI]" 1.text
   i 这是个测试文本1
 I hello world
# 找出root yu nobody,不能是yu1
[root@hello xian]# grep -E "^(root|yu|nobody)\>" 1.txt
root:x:0:0:root:/root:/bin/bash
nobody:x:99:99:Nobody:/:/sbin/nologin
# 找出函数
[root@hello xian]# grep -E "[a-zA-Z]+\(\)" 1.text
# 找出每一行的第一个
[root@hello xian]# grep -E "^([^:])+\>" 1.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
libstoragemgmt:x:998:997:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin
 # 找出用户名和shell相同的用户
[root@hello xian]# grep -E "^([^:]+\>).*\1$" 1.txt
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

sed命令

字符流编辑器

sed 选项 sed内置命令 输入文件

选项

-n 取消默认输出

-i 直接将修改结果写入文件,不用-i,sed修改的是内存数据

-e 多次编辑,不需要管道符

-r 支持正则扩展

内置命令

a append,指定行添加

d delete

i insert 指定行前添加

p print,打印匹配行的内容,通常p和-n一起使用

s/正则/替换内容/g

sed匹配范围

空地址 全文处理

单地址 指定文件某一行

/pattern/ 被模式匹配到的每一行

范围区间 10,20 十到二十行, 10,+5 第10行向下5行 , /pattern1/,/pattern2/

步长 1~2,表示1,3,5,7,9,2~2两个步长,表示2、4、6、8、10、偶数

image-20200902203244903.png

# 输出第2行和第3行,-n 否则会全部输出
[root@hello xian]# sed "2,3p" 1.text -n
这是个测试文本2
hello world
[root@hello xian]# cat 1.text
这是个测试文本1
这是个测试文本2
hello world
three
world

[root@hello xian]# sed "2,+3p" 1.text -n
这是个测试文本2
hello world
three
world
# 过滤
[root@hello xian]# sed "/hello/p" 1.text -n
hello world
#删除
[root@hello xian]# sed "/hello/d" 1.text
这是个测试文本1
这是个测试文本2
three
world
# 从第3行删除到结尾,单引号
[root@hello xian]# sed '3,$d' 1.text -i
这是个测试文本1
这是个测试文本2
# 替换
[root@hello xian]# sed "s/这/好/g" 1.text
好是个测试文本1
好是个测试文本2
hello world
three
world
#-e 多次编辑,不需要管道符
[root@hello xian]# sed -e "s/好/这/g" -e "s/测试/开发/g" 1.text
这是个开发文本1
这是个开发文本2
hello world
three
world
# a 追加
[root@hello xian]# sed "2a zhuijia" 1.text
这是个测试文本1
这是个测试文本2
zhuijia
hello world
three
world
[root@hello xian]# sed "2a zhuijia" 1.text -i
# 追加多行
[root@hello xian]# sed "2a zhuijia\nzuijia2" 1.text
这是个测试文本1
这是个测试文本2
zhuijia
zuijia2
zhuijia
hello world
three
world
# 在每一行下面加分隔符,a前面不加数字,表示每一行
[root@hello xian]# sed "a _________" 1.text
这是个测试文本1
_________
这是个测试文本2
_________
zhuijia
_________
hello world
_________
three
_________
world
_________
#取ip地址 .* 匹配任意
[root@hello xian]# ifconfig eth0 | sed "2p" -n | sed  "s/^.*inet//g" | sed "s/net.*$//g"
 172.21.0.16
[root@hello xian]# ifconfig eth0 | sed -e "2s/^.*inet//p" -e "2s/net.*$//p" -n
 172.21.0.16  netmask 255.255.240.0  broadcast 172.21.15.255
 172.21.0.16
[root@hello xian]# ifconfig eth0 | sed -e "2s/^.*inet//" -e "2s/net.*$//p" -n
 172.21.0.16

#练习
# 替换文件的root为koot,只替换一次并替换所有
sed 's/root/koot/gp' 1.txt -n
# 替换前10行,bin开头的改位C,仅仅显示替换的结果
sed -n '1,10s/^bin/C/p' 1.txt
# 替换前10行,bin开头的改位C,将m开头的改为M,仅仅显示替换的结果
sed -n -e "1,10s/^bin/C/p" -e 's/^m/M/p' 1.txt
#删除4行后面所有
sed '5,$d' 1.txt -i
# 删除从root到ftp行
[root@hello xian]# sed '/^root/,/^ftp/d' 1.txt
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
libstoragemgmt:x:998:997:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
syslog:x:996:994::/home/syslog:/bin/false
openvpn:x:995:993:OpenVPN:/etc/openvpn:/sbin/nologin
# 将文件中空白字符开头的行添加注释符
[root@hello xian]# sed -e 's/^[[:space:]]/#/g' -e 's/^$/#/g' 1.text
#  i 这是个测试文本1
这是个测试文本2
#zhuijia
#I hello world
three
world
# 删除文件的空白和注释行
sed -e '/^#/d' -e '/^$/d' 1.txt
sed -e '/^#/d;/^$/d'  1.txt
# 找出系统版本 \1 打印分组内容
sed -r -n 's/.*release[[:space:space]]*([^.]+).*/\1/p' 1.txt
本文由 简悦 SimpRead 转码, 原文地址 segmentfault.com

1 命令的基本格式

1.1 命令的提示符

[root@localhost ~]#

  • []:这是提示符的分隔符号,没有特殊含义。
  • root:显示的是当前的登录用户, 目前使用的是 root 用户登录。
  • @:分隔符号,没有特殊含义。
  • localhost:当前系统的简写主机名(完整主机名是 localhost.localdomain)。
  • ~:代表用户当前所在的目录,此例中用户当前所在的目录是家目录。
  • #:命令提示符。超级用户是 #,普通用户是 $

1.2 命令的基本格式

[root@localhost ~]# 命令 [选项] [参数]

  • 选项:是用于调整命令的功能的
  • 参数:是命令的操作对象

2 目录操作命令

2.1 ls 命令

ls 是最常见的目录操作命令,主要作用是显示目录下的内容

  • 命令名称:ls
  • 英文原意:list
  • 所在路径:/bin/ls
  • 执行权限:所有用户
  • 功能描述:显示目录下的内容

命令格式:ls [选项] [目录名]

  • 选项

    • -a: 显示所有文件
    • --color=when: 支持颜色输出,when 的值默认是 _always_(总显示颜色),也可以是 _never_(从不显示颜色) 和 _auto_(自动)
    • -d: 显示目录信息,而不是目录下的文件
    • -h: 人性化显示,按照我们习惯的单位显示文件大小
    • -i: 显示文件的节点号
    • -l: 长格式显示

示例:

[root@localhost ~]# ls -l
#权限 引用计数 所有者 所属组 大小 文件修改时间 文件名
-rw-------. 1 root root  1446 12月 19 16:15 anaconda-ks.cfg
“-l” 选项用于显示文件的详细信息,那么 “-l” 选项显示的这 7 列分别是什么含义?
第一列:权限。
第二列:引用计数。文件的引用计数代表该文件的硬链接个数,而目录的引用计数代表该目录
有多少个一级子目录。
第三列:所有者,也就是这个文件属于哪个用户。默认所有者是文件的建立用户
第四列:所属组。默认所属组是文件建立用户的有效组,一般情况下就是建立用户的所在组。
第五列:大小。默认单位是字节。
第六列:文件修改时间。文件状态修改时间或文件数据修改时间都会更改这个时间,注意这个
时间不是文件的创建时间。
第七列:文件名。

2.2 cd 命令

cd 是切换所在目录的命令,基本信息如下:

  • 命令名称:cd
  • 英文原意:change directory
  • 所在路径:shell 内置命令
  • 执行权限:所有用户
  • 功能描述:切换所在目录

命令格式:cd [-L|-P] [dir]

  • 选项:

    • -L:(默认值)如果要切换到的目标目录是一个符号连接,那么切换到符号连接的目录。
    • -P: 如果要切换到的目标目录是一个符号连接,那么切换到它指向的物理位置目录。
  • 参数:

    • 可以是绝对路径 (以根目录为参照物) 或相对路径(以当前目录为参照物)
简化用法
cd ~: 当前用户的加目录
cd -:上一次所在目录
cd .: 当前目录
cd ..: 上级目录

2.3 pwd 命令

pwd 命令是查询所在目录的命令,基本信息如下:

  • 命令名称:pwd
  • 英文原意:print name of current/working directory
  • 所在路径:/bin/pwd
  • 执行权限:所有用户
  • 功能描述:查询当前所在目录

2.4 mkdir 命令

  • 命令名称:mkdir
  • 英文原意:make directories
  • 所在路径:/bin/mkdir
  • 执行权限:所有用户
  • 功能描述:创建空目录

命令格式:mkdir [选项] 目录名

  • 选项:

    • -p: 递归建立所需目录
    • -m 权限:建立目录的同时设置目录的权限

2.5 rmdir 命令

rmdir 命令删除空目录,基本信息如下:

  • 命令名称:rmdir
  • 英文原意:remove empty directories
  • 所在路径:/bin/rmdir
  • 执行权限:所有用户
  • 功能描述:删除空目录

命令格式:rmdir [选项] 目录名

  • 选项:

    • -p: 递归删除目录
rmdir命令的作用十分有限,只能删除空目录,一旦目录中有内容就会报错。所以一般不论删除的是文件还是目录,都会使用rm命令

3 文件操作命令

3.1 touch 命令

touch 命令创建空文件或修改文件时间,基本信息如下:

  • 命令名称:touch
  • 英文原意:change file timestamps
  • 所在路径:/bin/touch
  • 执行权限:所有用户
  • 功能描述:创建文件或改文件时间戳

命令格式:touch [选项] 文件名

  • 选项:

    • -a:或 --time=atime 或 --time=access 或 --time=use 更改存取时间为当前时间 (access time)
    • -m:或 --time=mtime 或 --time=modify 更该变动时间为当前时间 (modify time)
    • -t 日期时间: 使用指定的日期时间 (格式:[[CC]YY]MMDDhhmm[.ss]),而非现在的时间
    • -r 参考文件或目录: 把指定文件或目录的日期时间统统设成参考文件或目录的日期时间

3.2 cat 命令

cat 命令用来查看文件内容,进本信息如下:

  • 命令名称:cat
  • 英文原意:concatenate files and print on the standard output
  • 所在路径:/bin/cat
  • 执行权限:所有用户
  • 功能描述:合并文件并打印输出到标准输出

命令格式:cat [选项] 文件名

  • 选项:

    • -E: 列出每行结尾的回车符 $
    • -n: 显示行号
    • -T: 把 Tab 键用 ^I 显示出来
    • -v: 列出特殊字符
    • -A: 相当于 - vET 选项的整合,用于列出所有隐藏符号

3.3 more 命令

more 是分屏显示文件的命令,基本信息如下:

  • 命令名称:more
  • 英文原意:file perusal filter for crt viewin
  • 所在路径:/bin/more
  • 执行权限:所有用户
  • 功能描述:分屏显示文件内容

命令格式:more [选项] 文件名

  • 选项:

    • -d:显示 “[press space to continue,'q' to quit.]” 和“[Press 'h' for instructions]”;
    • -c:不进行滚屏操作。每次刷新这个屏幕
    • -s:将多个空行压缩成一行显示
    • -u:禁止下划线
    • -数字:指定每屏显示的行数
    • +数字:从指定数字的行开始显示

more 命令比较简单,一般不用什么选项,命令会打开一个交互界面,可以识别一些交互命令。常用的交互命令如下:

  • 空格键:向下翻页
  • B 键: 向上翻页
  • / 字符串:搜索指定的字符串
  • q: 退出

3.4 less 命令

less 命令和 more 命令类似,只是 more 命令是分屏显示,而 less 是分行显示命名,less 命令允许用户向前 (PageUp 键) 或向后 (PageDown 键) 浏览文件,基本信息如下:

  • 命令名称:less
  • 英文原意:opposite of more
  • 所在路径:/usr/bin/more
  • 执行权限:所有用户
  • 功能描述:分行显示文件内容

命令格式:less [选项] 文件名

  • -e:文件内容显示完毕后,自动退出
  • -f:强制显示文件
  • -g:不加亮显示搜索到的所有关键词,仅显示当前显示的关键字,以提高显示速度
  • -l:搜索时忽略大小写的差异
  • -N:每一行行首显示行号
  • -s:将连续多个空行压缩成一行显示
  • -S:在单行显示较长的内容,而不换行显示
  • -x数字:将 TAB 字符显示为指定个数的空格字符

3.5 head 命令

head 命令是用来显示文件开头内容的命令,基本信息如下:

  • 命令名称:head
  • 英文原意:output the first part files
  • 所在路径:/usr/bin/head
  • 执行权限:所有用户
  • 功能描述:显示文件开头的内容

命令格式:head [选项] 文件名

  • -n 行数:从文件开头开始,显示指定行数
  • -v:显示文件名

3.6 tail 命令

tail 命令是用来显示文件结尾内容的命令

  • 命令名称:tail
  • 英文原意:output the last part files
  • 所在路径:/usr/bin/tail
  • 执行权限:所有用户
  • 功能描述:显示文件结尾的内容

命令格式:tail [选项] 文件名

  • -n 行数:从文件结尾开始,显示指定行数
  • -v:显示文件名
  • -f: 监听文件新增内容

3.7 ln 命令

ln 命令用来为文件创件链接,连接类型分为硬连接和符号连接 (软链接) 两种,基本信息如下:

  • 命令名称:ln
  • 英文原意:make links between file
  • 所在路径:/bin/tail
  • 执行权限:所有用户
  • 功能描述:在文件之间建立链接

命令格式:ln [选项] 源文件 [目标文件]

  • 选项:

    • -s: 建立软链接文件。如果不加'-s'选项,则建立硬链接文件
    • -f: 强行删除已存在的链接文件。如果链接文件已存在,则删除目标文件后再建立链接文件
  • 源文件:指定链接的源文件。如果使用-s选项创建软链接,则 “源文件” 可以是文件或者目录,创建硬链接时,则 “源文件” 参数只能是文件。(源文件最好用绝对路径名,这样可以在任何工作目录下进行符号链接,而当源文件用相对路径时,如果当前的工作路径与要创建的符号链接文件所在路径不同,就不能进行链接)
  • 目标文件:指定源文件的目标链接文件,省略则在当前目录下新建与源文件名称相同的链接文件

硬链接和源文件实际上是同一个文件,不会创建新的文件(类似于 Java 中,一个对象有多个引用);而软链接会创建一个新文件来保存源文件的路径,从而间接读取或修改源文件内容
硬链接与软链接的特征
硬链接特征

  1. 源文件和硬链接文件拥有相同的 Indoe 和 Block
  2. 修改任意一个文件,另一个都改变
  3. 删除任意一个文件,另一个都能使用
  4. 硬链接建立或删除,原文件连接数相应加一或减一
  5. 硬链接不能链接目录
  6. 硬链接不能跨分区
  7. 硬链接标记不清,很难确认硬链接文件位置,不建议使用

软链接特征

  1. 软链接和源文件拥有不同的 Inode 和 Block
  2. 两个文件修改任意一个,另一个都改变
  3. 删除软链接,源文件不受影响;删除源文件,软链接不能使用
  4. 软链接建立或删除,原文件链接数不变
  5. 软链接可以链接目录
  6. 软链接可以跨分区
  7. 软链接特征明显,建议使用软链接
  8. 软链接没有实际数据,只是保存源文件的 Inode,不论源文件多大,软链接大小不变
  9. 软链接的权限是最大权限lrwxrwxrwx.,但是由于没有实际数据,最终访问时需要参考源文件权限

4 文件和目录都能操作的命令

4.1 rm 命令

rm 是最强大的删除命令,不仅可以删除文件,也可以删除目录,基本信息如下:

  • 命令名称:rm
  • 英文原意:remove files or directories
  • 所在路径:/bin/rm
  • 执行权限:所有用户
  • 功能描述:删除文件或目录

命令格式:rm [选项] 文件或目录

  • 选项:

    • -f: 强制删除
    • -i: 交互删除,在删除之前会询问用户
    • -r: 递归删除,可以删除目录

4.2 cp 命令

cp 命令用于复制文件或目录,基本信息入下:

  • 命令名称:cp
  • 英文原意:copy files and directories
  • 所在路径:/bin/cp
  • 执行权限:所有用户
  • 功能描述:复制文件或目录

命令格式:cp [选项] 源文件 目标文件

  • 选项:

    • -d: 如果文件为软链接 (对硬链接无效),则复制出的目标文件也为软链接
    • -i: 询问,如果目标文件已经存在,则会询问是否覆盖
    • -p: 复制后目标文件保留源文件的属性 (包括所有者、所有组、权限和时间)
    • -r: 递归复制,用于复制目录
    • -a: 相当于-dpr选项的集合

4.3 mv 命令

mv 命令用来剪贴文件或目录,基本信息如下:

  • 命令名称:mv
  • 英文原意:move(rename) files
  • 所在路径:/bin/mv
  • 执行权限:所有用户
  • 功能描述:移动文件或目录

命令格式:cp [选项] 源文件 目标文件

  • 选项:

    • -f: 强制覆盖,如果目标文件已经存在,则不询问直接强制覆盖
    • -i: 交互模式,如果目标文件已经存在,则询问用户是否覆盖(默认选项)
    • -v:显示详细信息

4.4 stat 命令

stat 命令是查看文件详细的命令,基本信息如下:

  • 命令名称:stat
  • 英文原意:display file or file system status
  • 所在路径:/usr/bin/stat
  • 执行权限:所有用户
  • 功能描述:显示文件或文件系统的详细信息

命令格式:stat [选项] 文件名

  • 选项:

    • -f:显示文件系统状态而非文件状态
    • -t:以简洁方式输出信息

5 基本权限管理

5.1 权限介绍

使用 ls 命令时,长格式显示的第一列就是文件的权限,例如:

[root@localhost ~]# ls -l install.log
-rw-r--r--. 1 root root 28425 11月 30 18:50 install.log

第一列的权限位 (-rw-r--r--.) 如果不计最后的 "." (这个点代表受 SELinux 安全上下文保护,这里暂时忽略不做介绍),则共 10 位,这 10 位权限位的含义如下图所示:
wps1.png

  • 第 1 位:代表文件类型。Linux 不像 Windows 使用扩展名表示文件类型,而是使用权限位的第一位表示文件类型。虽然 Linux 文件的种类不像 Windows 中那么多,但是分类也不少,详细情况可以使用 “info ls” 命令查看。这里列出一些常见的文件类型:

    • -: 普通文件
    • d: 目录文件。Linux 中一切皆文件,所以目录也是文件的一种
    • l: 软链接文件
    • b: 块设备文件。这是一种特殊设备文件,存储设备都是这种文件,如分区文件 / dev/sda1 就是这种文件
    • c: 字符设备文件。这也是特殊设备文件,输入设备一般都是这种文件,如鼠标、键盘等
    • p: 管道符文件。这是一种非常少见的特殊设备文件。
    • s: 套接字文件。这也是一种特殊设备文件,一些服务支持 socket 访问就会产生这样的文件
  • 第 2~4 位:代表文件所有者的权限

    • r: 代表 read,是读取权限
    • w: 代表 write,是写权限
    • x: 代表 execute,是执行权限
  • 第 5~7 位:代表文件所属组的权限,同样拥有 “rwx” 权限
  • 第 8~10 位:代表文件其他人的权限,同样拥有 “rwx” 权限

权限含义的解释:
读、写、执行权限对文件和目录的作用是不同的。

  • 权限对文件的作用

    • 读 (r):对文件有读权限,代表可以读取文件中的数据。如果把权限对应到命令上,那么一旦对文件有读权限,就可以对文件执行catmorelessheadtail等文件查看命令
    • 写 (w):对文件有写权限,代表可以修改文件中的数据。如果把权限对应到命令上,那么一旦对文件有写权限,就可以对文件执行vimecho等修改文件数据的命令。注意:对文件有写权限,是不能删除文件本身的,只能修改文件中的数据,如果想要删除文件,则需要对文件的上级目录拥有写权限
    • 执行 (x):对文件有执行权限,代表文件可以运行。在 Linux 中,只要文件有执行权限,这个文件就是执行文件了,只是这个文件到底能不能正确执行,不仅需要看执行权限,还要看文件的代码是不是正确的语言代码。对文件来说,执行权限是最高权限
  • 权限对目录的作用

    • 读 (r):对目录有读权限,代表可以查看目录下的内容,也就是可以查看目录下有哪些文件和子目录。如果包权限对应到命令上,那么一旦对目录拥有了读权限,就可以在目录下执行ls命令查看目录下的内容了
    • 写 (w):对目录有写权限,代表可以修改目录下的数据,也就是可以在目录中新建、删除、复制、剪贴子文件或子目录。如果把权限对应到命令上,那么一旦对目录拥有了写权限,就可以在目录下执行touchrmcpmv等命令。对目录来说,写权限是最高权限
    • 执行 (x):目录是不能运行的,那么对目录拥有执行权限,代表可以进入目录。如果把权限对应到命令上,那么一旦对目录拥有了执行权限,就可以对目录执行cd命令进入目录

5.2 chmod 命令

chmod 用来修改文件的权限,基本信息如下:

  • 命令名称:chmod
  • 英文原意:change file mode bits
  • 所在路径:/bin/chmod
  • 执行权限:所有用户
  • 功能描述:修改文件的权限模式

命令格式:chmod [选项] 权限模式 文件或目录

  • 选项:

    • -R: 递归设置权限,也就是给予目录中的所有文件设定权限
    • --reference=RFILE:使用参考文件或参考目录 RFILE 的权限来设置目标文件或目录的权限。

chmod 命令的权限模式分为符号组合八进制数组合
符号组合的格式是[ugoa][[+-=][permission]],也就是[用户身份][[赋予方式][权限]]的格式。

  • 用户身份

    • u:代表所有者 (user)
    • g:代表所属组 (group)
    • o:代表其他人 (other)
    • a:代表全部身份 (all)
  • 赋予方式

    • +:加入权限
    • -:减去权限
    • =:设置权限
  • 权限

    • r: 读取权限 (read)
    • w: 写权限 (write)
    • x: 执行权限 (execute)

八进制数组合的格式是[0-7][0-7][0-7]三位数字组成 (每一位数字都是权限之和),第一位是所有者权限,第二位是所属组权限,第三位其他人权限

  • r读取权限对应的数字是4
  • w写权限对应的数字是2
  • x执行权限对应的数字是1
  • 例如读写权限rw八进制数表示 6

示例:

# 添加组用户的写权限。
chmod g+w ./test.log 
# 删除其他用户的所有权限。  
chmod o= ./test.log 
# 使得所有用户都没有写权限。  
chmod a-w ./test.log 
# 当前用户具有所有权限,组用户有读写权限,其他用户只有读权限。  
chmod u=rwx, g=rw, o=r ./test.log (等价的八进制数表示:chmod 754 ./test.log )   
# 将目录以及目录下的文件都设置为所有用户拥有读写权限。注意,使用'-R'选项一定要保留当前用户的执行和读取权限,否则会报错!  
chmod -R a=rw ./testdir/ 
# 根据其他文件的权限设置文件权限。  
chmod --reference=./1.log ./test.log

5.3 chown 命令

chown 命令用来修改文件和目录的所有者和所属组,基本信息如下:

  • 命令名称:chown
  • 英文原意:change file owner and group
  • 所在路径:/bin/chown
  • 执行权限:所有用户
  • 功能描述:修改文件和目录的所有者和所属组

命令格式:chown [选项] 所有者[:所属组] 文件或目录

  • 选项:

    • -R:递归设置权限,也就是给予子目录的所有文件设置权限
  • 当省略 “: 所属组” ,仅改变文件所有者
注意:普通用户不能修改文件的所有者,哪怕自己是这个文件的所有者也不行。普通用户可以修改所有者是自己的文件权限。

5.4 umask 命令

umask 命令用来显示或设置创建文件或目录的权限掩码。

我们需要先了解一下新建文件和目录的默认最大权限,对于文件来讲,新建文件的默认最大权限是666,没有执行权限,只是因为执行权限对文件来讲比较危险,不能再新建文件的时候默认赋予,而必须通过用户手工赋予;对于目录来讲,新建目录的默认最大权限是777,这是因为对目录而言,执行权限仅仅代表进入目录,所以即使新建目录时直接默认赋予也没有什么危险。

按照官方的标准算法,umask默认权限需要使用二进制进行逻辑与和逻辑非联合运算才可以得到正确的新建文件和目录的默认权限,这种方法既不好计算也不好理解,不推荐。我们这里按照权限字母来讲解umask权限的计算方。我们就按照默认的umask值是0022(等效于022) 分别来计算一下新建文件和目录的默认权限,

  • 文件的默认权限最大只能是666,而umask的值是022,则 rw-rw-rw- 减去 ----w--w-等于rw-r--r--,所以新建文件的默认权限是rw-r--r--
  • 目录的默认权限最大是777,而umask的值是022,则 rwxrwxrwx 减去 ----w--w-等于rwxr-xr-x,所以新建目录的默认权限是rwxr-xr-x
  • 同理,如果umask的值是033,新建文件的默认权限为 rw-rw-rw- 减去 ----wx-wx等于rw-r--r--

命令格式:umask [选项] [模式]

  • 选项:

    • -p:输出的权限掩码可直接作为指令来执行
    • -S:以符号组合的方式输出权限掩码,不使用该选项时以八进制数的形式输出

示例:

# 以八进制数的形式输出权限掩码
[root@localhost tmp]# umask
0022
# 以八进制数的形式输出权限掩码,并作为指令来执行 
[root@localhost tmp]# umask -p
umask 0022
# 以符号组合的方式输出权限掩码。
[root@localhost tmp]# umask -S
u=rwx,g=rx,o=rx

#上条命令以符号组合的方式输出权限掩码,输出的结果u=rwx,g=rx,o=rx转化为八进制数等于0755,
#用八进制数来设置同样的权限,umask需要额外的执行减法"0777 - 0755"即0022
[root@localhost tmp]# umask 0022

# 为组用户添加写权限
[root@localhost tmp]# umask g+w
# 删除其他用户的写、执行权限
[root@localhost tmp]# umask o-wx
# 赋值全部用户所有权限,等价于umask u=rwx,g=rwx,o=rwx
[root@localhost tmp]# umask a=rwx
#清除其他用户的读、写、执行权限
[root@localhost tmp]# umask o=

6 帮助命令

6.1 man 命令

man 命令是最常见的帮助命令,也是 Linux 最主要的帮助命令,基本信息如下:

  • 命令名称:man
  • 英文原意:format and display the on-line manual pages
  • 所在路径:/usr/bin/chown
  • 执行权限:所有用户
  • 功能描述:显示连机帮助手册

命令格式:man [选项] [章节] 命令

  • 选项:

    • -f: 查看命令有哪些章节的帮助和简短描述信息,等价于whatis指令
    • -k: 查看和命令相关的所有帮助

man命令交互快捷键:

  • 上箭头:向上移动一行
  • 下箭头:向下移动一行
  • PgUP:向上翻一页
  • PgDn:向下翻一页
  • g:移动到第一页
  • G:移动到最后一页
  • q:退出
  • /字符串:从当前向下搜索字符串
  • ?字符串:从当前向上搜索字符串
  • n:当搜索字符串时,可以用 n 键找到下一个字符串
  • N:当搜索字符串时,使用 N 键反向查询字符串。也就是说,如果使用 “/ 字符串” 方式搜索,则 N 键表示向上搜索字符串;如果使用 “? 字符串” 方式搜索,则 N 键表示向下搜索字符串

man手册章节:

  • 1: 用户在 shell 环境可操作的命令或执行文件
  • 2: 系统内核可调用的函数与工具等
  • 3: 一些常用的函数 (function) 与函数库(library),大部分为 C 的函数库(libc)
  • 4: 设备文件说明,通常在 / dev 下的文件
  • 5: 配置文件或某些文件格式
  • 6: 游戏帮助 (个人版的 Linux 中是有游戏的)
  • 7: 惯例与协议等,如 Linux 文件系统,网络协议,ASCII code 等说明
  • 8: 系统管理员可用的管理命令
  • 9: 跟 kernel 有关的文件

man手册的格式:

  • NAME: 命令名称及功能简要说明
  • SYNOPSIS:用法说明,包括可用的选项

    • []:可选内容
    • <>:必选内容
    • a|b:二选一
    • {}:分组
    • ...:同意内容可出现多次
  • DESCRIPTION:命令功能的详细说明,可能包括每一个选项的意义
  • OPTIONS:说明每一项的意义
  • EXAMPLES:使用示例
  • FILES:此命令相关的配置文件
  • AUTHOR:作者
  • COPYRIGHT:版本信息
  • REPORTTING BUGS:bug 信息
  • SEE ALSO:参考其他帮助

示例:
我们输入 man ls,它会在最左上角显示 “LS(1)”,在这里,“LS” 表示手册名称,而 “(1)” 表示该手册位于第一节章,同样,我们输 man ifconfig 它会在最左上角显示 “IFCONFIG(8)”。也可以这样输入命令:“man [章节号] 手册名称”。

man是按照手册的章节号的顺序进行搜索的,比如:man sleep 只会显示 sleep 命令的手册,如果想查看库函数 sleep,就要输入:man 3 sleep

6.2 info 命令

info 命令的帮助信息是一套完整的资料,每个单独命令的man帮助信息只是这套完整资料的某一个区段 (节点),基本信息如下:

  • 命令名称:info
  • 英文原意:info
  • 所在路径:/usr/bin/info
  • 执行权限:所有用户
  • 功能描述:显示一套完整的帮助信息资料

命令格式:info [选项] 参数

  • 选项:

    • -d:添加包含 info 格式帮助文档的目录
    • -f:指定要读取的 info 格式的帮助文档
    • -n:指定首先访问的 info 帮助文件的节点
    • -o:输出被选择的节点内容到指定文件
  • 参数:指定需要获得帮助的主题,可以是指令、函数以及配置文件

info命令交互快捷键

  • 上箭头:向上移动一行
  • 下箭头:向下移动一行
  • PgUP:向上翻一页
  • PgDn:向下翻一页
  • Tab:在有 “*” 符号的节点间切换
  • 回车:进入有 “*” 符号的子页面,查看详细帮助信息
  • u:进入上一层信息 (回车是进入下一层信息)
  • q:退出 info 帮助信息
  • n:进入下一小节信息
  • p:进入上一下节信息
  • ?:查看帮助信息

6.3 help 命令

help 命令只能获取 shell 内置命令的帮助,基本信息如下:

  • 命令名称:help
  • 英文原意:help
  • 所在路径:shell 内置命令
  • 执行权限:所有用户
  • 功能描述:显示 shell 内置命令的帮助。可以使用 shell 内置命令type来区分内置命令与外部命令,对于外部命令的帮助信息只能使用man或者info命令查看

命令格式:help [选项] 内置命令

  • 选项:

    • -d:显示内建命令的简要描述。
    • -m:按照 man 手册的格式输出内置命令的帮助信息。
    • -s:仅输出内建命令的命令格式。

示例:

# 以man手册的格式查看内置命令type的帮助信息
[root@localhost ~]# help -m type
NAME
    type - Display information about command type.

SYNOPSIS
    type [-afptP] name [name ...]
 (省略。。。)

# 查看ls、help命令是否是内置命令
[root@localhost ~]# type ls
ls is aliased to `ls --color=auto'
[root@localhost ~]# type help
help is a shell builtin

6.4 --help 选项

绝大多数命令都可以使用--help选项来查看帮助,者也是一种获取帮助的方法。例如 ls --help,这种方法非常简单,输出的帮助信息基本上是man命令的信息简要版。

7 搜索命令

7.1 whereis 命令

whereis 是搜索命令的命令,也就是说 whereis 不能搜索普通文件,而只能搜索系统命令,基本信息如下:

  • 命令名称:whereis
  • 英文原意:locate the binary,source,and manual page files for a command
  • 所在路径:/usr/bin/whereis
  • 执行权限:所有用户
  • 功能描述:查找二进制命令、源文件和帮助文档的路径

命令格式:whereis [选项] 参数

  • 选项:

    • -b:只查找二进制文件
    • -B 目录:只在设置的目录下查找二进制文件
    • -m:只查找说明文件
    • -M 目录:只在设置的目录下查找说明文件
    • -s:只查找原始代码文件
    • -S 目录:只在设置的目录下查找原始代码文件
    • -f:不显示文件名前的路径名称

7.2 which 命令

which 也是搜索系统命令的命令,和whereis的区别在于,whereis命令可以在查找二进制命令的同时,查找帮助文档的位置,而which命令在查找到二进制命令的同时,如果这个命令有别名,则还可以查到别名命令。基本信息如下:

  • 命令名称:which
  • 英文原意:shows the full path of (shell) commands
  • 所在路径:/usr/bin/which
  • 执行权限:所有用户
  • 功能描述:列出二进制命令路径和别名。which只会在环境变量 $PATH 设置的目录里查找符合条件的命令

命令格式:which [选项] 参数

7.3 find 命令

find 命令用来在指定目录下查找文件,基本信息如下:

  • 命令名称:find
  • 英文原意:search for files in a directory hierarchy
  • 所在路径:/bin/find
  • 执行权限:所有用户
  • 功能描述:在指定目录中搜索文件

命令格式:find [搜索路径] [选项]

  • 搜索路径:省略则默认为当目录,相当于 "find ."
  • 选项:

    • -name 范本样式:按照文件名称搜索,支持通配符模糊查询
    • -iname 范本样式:此参数的效果和指定 “-name” 参数类似,但忽略字符大小写的差别
    • -inum inode编号:查找符合指定的 inode 编号的文件或目录
    • -path 范本样式:查找路径包含范本样式的文件或目录
    • -regex 范本样式:正则表达式搜索
    • -iregex 范本样式:同 "-regex",忽略大小写
    • -size [+|-]文件大小[cwbkMG] :查找符合指定的文件大小的文件

      • "+" 的意思是搜索比指定大小还要大的文件,"-" 的意思是搜索比指定大小还要小的文件
      • "cwbkMG" 是单位,c——字节,w——字 (2 字节),b——块 (512 字节),k——千字节,M——兆字节,G——吉字节。如果不写单位默认是 b
    • -atime [+|-]天数:按照文件最后一次访问时间搜索,单位每天

      • "+"、"-" 的含义,例如 "5" 表示恰好 5 天前的那一天,"+5" 超过 5 天前的时间,"-5"5 天内的时间。(以下按时间搜索选项中 "+"、"-" 含义相同)
    • -mtime [+|-]天数:按照文件数据最后一次修改时间搜索,单位每天
    • -ctime [+|-]天数:按照文件元数据 (如权限等) 最后一次修改时间搜索,单位每天
    • -amin [+|-]分钟数:按照文件最后一次访问时间搜索,单位每分钟
    • -mmin [+|-]分钟数:按照文件数据最后一次修改时间搜索,单位每分钟
    • -cmin [+|-]分钟数:按照文件元数据 (如权限等) 最后一次修改时间搜索,单位每分钟
    • -perm [+|-]权限数值:查找符合指定的权限数值的文件或目录。例如,权限数值为 "766" 表示权限恰好等于 766,"-766" 表示文件权限必须全部包含 766,"+766" 表示文件权限包含 766 任意一个权限
    • -uid 用户ID:查找所有者是指定用户 ID 的文件
    • -user 用户名:查找所有者是指定用户名的文件
    • -gid 组ID:查找所有组是指定组 ID 的文件
    • -group 组名:查找所有组是指定组名的文件
    • -nouser:查找没有所有者的文件

      • 按照所有者和所有组搜索时,"-nouser" 选项比较常用,主要用于查找垃圾文件。没有所有者的文件比较少见,那就是外来文件,比如光盘和 U 盘的文件是由 Windows 复制的,在 Linux 中查看就是没有所有者的文件,再比如手工源码包安装的文件也可能没有所有者
    • -type 文件类型:只寻找符合指定的文件类型的文件

      • f——普通文件,l——符号连接,d——目录,c——字符设备,b——块设备,s——套接字,p——Fifo
    • -empty:查找文件大小为 0 的文件
    • -maxdepth 目录层级数:设置搜索的最大目录层级
    • -mindepth 目录层级:设置搜索的最小目录层级
    • -exec 执行指令:把 find 命令查找结果交由 "-exec" 调用的命令来处理

      • 格式:find [搜索路径] [选项] -exec 命令 {} \;, 其中 "{}" 代表 find 命令的查询结果
    • -ok 执行指令:此参数的效果和指定 “-exec” 类似,但在执行指令之前会先询问用户是否执行
    • -prune:不寻找字符串作为寻找文件或目录的范本样式
    • -a:and 逻辑与
    • -o: or 逻辑或
    • -not:not 逻辑非

示例:

#==================根据文件名或者正则表达式进行匹配=====================
#列出当前目录及子目录下所有文件和文件夹
[root@localhost ~]# find .
#在`/home`目录下查找以.txt结尾的文件名
[root@localhost ~]# find /home -name "*.txt"
#同上,但忽略大小写
[root@localhost ~]# find /home -iname "*.txt"
#当前目录及子目录下查找所有以.txt和.pdf结尾的文件
[root@localhost ~]# find . \( -name "*.txt" -o -name "*.pdf" \)
或
[root@localhost ~]# find . -name "*.txt" -o -name "*.pdf"
#查找路径包含local的文件或者目录
[root@localhost ~]# find /usr/ -path "*local*"
#基于正则表达式匹配文件路径
[root@localhost ~]# find . -regex ".*\(\.txt\|\.pdf\)$"


#=====================借助`-exec`选项与其他命令结合使用==================
#找出当前目录下所有root的文件,并把所有权更改为用户tom
[root@localhost ~]# find .-type f -user root -exec chown tom {} \;
#找出自己家目录下所有的.txt文件并删除,删除前先询问
[root@localhost ~]# find $HOME/. -name "*.txt" -ok rm {} \;
#查找当前目录下所有.txt文件并把他们拼接起来写入到all.txt文件中
[root@localhost ~]# find . -type f -name "*.txt" -exec cat {} \;> all.txt
#将30天前的.log文件移动到old目录中
[root@localhost ~]# find . -type f -mtime +30 -name "*.log" -exec cp {} old \;
#找出当前目录下所有.txt文件并以“File:文件名”的形式打印出来
[root@localhost ~]# find . -type f -name "*.txt" -exec printf "File: %s\n" {} \;

#========================逻辑运算符==========================
#查找文件大小超过2k并且是普通文件类型的文件
[root@localhost ~]# find . -size +2k -a -type f
#找出/home下不是以.txt结尾的文件
[root@localhost tmp]# find . -not -name "*.txt"
或
[root@localhost ~]# find /home ! -name "*.txt"


#======================搜索但跳出指定的目录===================
#查找当前目录或者子目录下所有.txt文件,但是跳过子目录sk
[root@localhost ~]# find . -path "./sk" -prune -o -name "*.txt"

7.4 locate 命令

locate 命令其实是find -name的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录 (find 是去硬盘找),而是搜索一个数据库/var/lib/mlocate/mlocate.db,这个数据库中含有本地所有文件信息。Linux 系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件,为了避免这种情况,可以在使用locate之前,先使用updatedb命令手动更新数据库。locate 命令基本信息如下:

  • 命令名称:locate
  • 英文原意:find files by name
  • 所在路径:/usr/bin/locate
  • 执行权限:所有用户
  • 功能描述:按照文件名搜索文件

命令格式:locate [选项] 文件名

  • 选项:

    • -d: 指定资料库的路径。默认是 / var/lib/mlocate/mlocate.db
    • -n:至多显示 n 个输出

数据库配置文件 (/etc/updatedb.conf) 内容说明:

[root@localhost ~]# cat /etc/updatedb.conf
#开启搜索限制,也就是让这个文件生效
PRUNE_BIND_MOUNTS = "yes"
#在locate执行搜索时,禁止搜索这些文件类型
PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fusectl gfs gfs2 gpfs hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs"
#在locate执行搜索时,禁止搜索这些扩展名的文件
PRUNENAMES = ".git .hg .svn"
##在locate执行搜索时,禁止搜索这些系统目录
PRUNEPATHS = "/afs /media /net /sfs /tmp /udev /var/cache/ccache /var/spool/cups /var/spool/squid /var/tmp"
locate 优缺点:
优点:按照数据库搜索,搜索速度快,消耗资源小
缺点:只能按照文件名来搜索文件,而不能执行更复杂的搜索,比如按照权限、大小、修改时间等

7.5 grep 命令

grep 命令的作用是在文件中提取和匹配符合条件的字符串行,是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。基本信息如下:

  • 命令名称:grep
  • 英文原意:global search regular expression(RE) and print out the line
  • 所在路径:/usr/bin/grep
  • 执行权限:所有用户
  • 功能描述:全面搜索正则表达式并把行打印出来

命令格式:grep [选项] 搜索内容 文件名

  • 选项:

    • -i:忽略大小写
    • -n:输出行号
    • -v:反向查找
    • -d 动作: 当指定要查找的是目录而非文件时,必须使用这项参数,否则 grep 指令将回报信息并停止动作。动作包含:read、recurse、skip
    • -R-r: 此参数的效果和指定 “-d recurse” 参数相同,递归查找目录下的所有文件内容
    • --color=auto:搜素出的关键字用颜色高亮显示

find 也是搜索命令,那么 find 与 grep 命令有什么区别呢?
find:find 命令用于在系统中搜索符合条件的文件名,如果需要模糊查询,则使用通配符进行匹配,通配符是完全匹配。(find 命令也可以通过 "-regex" 选项,把匹配规则转为正则表达式规则)
grep:grep 命令用于在文件中搜索符合条件的字符串,如果需要模糊查询,则使用正则表达式进行匹配,正则表达式是包含匹配。

通配符与正则表达式的区别

  • 通配符:一般用于匹配文件名,完全匹配

    • ?:匹配一个任意字符
    • *:匹配 0 个或多个任意字符,也就是可以匹配任何内容
    • []:匹配中括号里任意一个字符。例如,[abc] 代表一定匹配一个字符,或是 a,或是 b,或是 c
    • [-]:匹配中括号里任意一个字符,"-" 代表一个范围。例如,[a-z] 代表匹配一个小写字母
    • [^]:逻辑非,表示匹配不是中括号里的一个字符。例如,1 代表匹配一个不是数字的字符
  • 正则表达式:一般用于匹配字符串

    • ?:匹配前一个字符重复 0 次或 1 次
    • *:匹配前一个字符重复 0 次或多次
    • []:匹配中括号里任意一个字符。例如,[abc] 代表一定匹配一个字符,或是 a,或是 b,或是 c
    • [-]:匹配中括号里任意一个字符,"-" 代表一个范围。例如,[a-z] 代表匹配一个小写字母
    • [^]:逻辑非,表示匹配不是中括号里的一个字符。例如,1 代表匹配一个不是数字的字符
    • ^:匹配行首
    • $:匹配行尾

示例:

#在文件中搜索一个单词,命令会返回一个包含“match_pattern”的文本行:
[root@localhost ~]# grep match_pattern file_name
或
[root@localhost ~]# grep "match_pattern" file_name
#在多个文件中查找:
[root@localhost ~]# grep "match_pattern" file_1 file_2 file_3
#标记匹配颜色 --color=auto 选项:
[root@localhost ~]# grep "match_pattern" file_name --color=auto
#在当前目录中对文本进行递归搜索
[root@localhost ~]# grep -r "match_pattern" .
#正则匹配输出以数字开头的所有行
[root@localhost ~]# grep "^[0-9].*" file_name

7.6 | 管道符

命令格式:命令1 | 命令2
"|" 管道符的作用是把命令 1 的正确输出作为命令 2 的操作对象

示例 1
我们经常使用 "ll" 命令查看文件的长格式,不过在有些目录中文件很多,不如 / etc / 目录使用 "ll" 命令显示的内容就非常多,只能看到最后的内容而不能看到前面输出的内容,这时我们马上想到 "more" 命令可以分屏显示文件内容,一种笨方法是:

#用输出重定向,把"ll"命令的输出保存到/root/testfile
[root@localhost ~]# ll -a /etc/ > /root/testfile
#然后用more分屏显示
[root@localhost ~]# more /root/testfile

这样操作实在是不方便,这时可以利用管道符,命令如下:

#把"ll"命令的输出作为"more"命令的操作对象
[root@localhost ~]# ll -a /etc/ | more

示例 2

#在"ll"命令输出内容中搜索yum的文件名
[root@localhost ~]# ll -a /etc/ | grep yum

示例 3

#统计具体的网络连接数量("grep"命令筛选,"wc"命令统计)
[root@localhost ~]# netstat -an | grep -i "ESTABLISHED" | wc -l

7.7 alias 命令

alias 命令用来设置指令的别名,我们可以使用该命令可以将一些较长的命令进行简化。

alias 基本使用方法

  • 打印已经设置的命令别名

    • aliasalias -p
  • 给命令设置别名

    • 格式:alias 新的命令='实际命令'。必须使用单引号''实际命令引起来,防止特殊字符导致错误
    • 例如:alias l='ls -lsh',现在只用输入 "l" 就可以列出目录了,相当于输入 "ls -lsh";alias ser='service network restart',现在输入 "ser" 就可以重启网络服务了
直接在 shell 里设定的命令别名,在终端关闭或者系统重新启动后都会失效,如何才能永久有效呢?
使用编辑器打开~/.bashrc,在文件中加入别名设置,如:alias rm='rm -i',保存后执行 source ~/.bashrc,这样就可以永久保存命令的别名了。因为修改的是当前用户目录下的~/.bashrc 文件,所以这样的方式只对当前用户有用。如果要对所有用户都有效,修改 / etc/bashrc 文件就可以了。

8 压缩和解压缩命令

在 Linux 中可以识别的常见压缩格式有十几种,比如 ".zip"、".gz"、".bz2"、".tar"、".tar.gz"、".tar.bz2" 等。减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间

8.1 ".zip" 格式

".zip" 是 Windows 中最常见的压缩格式,Liunx 也可以正确识别 ".zip" 格式,这可以方便地和 Windows 系统通用压缩文件。

8.1.1 zip 命令

zip 命令就是 ".zip" 格式的压缩命令,基本信息如下:

  • 命令名称:zip
  • 英文原意:package and compress(archive) files
  • 所在路径:/usr/bin/zip
  • 执行权限:所有用户
  • 功能描述:压缩文件和目录

命令格式:zip [选项] 压缩包名 源文件或目录

  • 选项:

    • -r:压缩目录递归处理,将指定目录下的所有文件和子目录一并处理

8.1.2 unzip 命令

unzip 命令就是 ".zip" 格式的解压缩命令,基本信息如下:

  • 命令名称:unzip
  • 英文原意:list, test and extract compressed files in a zip archive
  • 所在路径:/usr/bin/unzip
  • 执行权限:所有用户
  • 功能描述:列表、测试和提取压缩文件中的文件

命令格式:unzip [选项] 压缩包名

  • 选项:

    • -d:指定解压的位置

8.2 ".gz" 格式

".gz" 格式是 Linux 中最常见的压缩格式。

8.2.1 gzip 命令

gzip 命令是 ".gz" 格式的压缩和解压缩命令,既方便又好用。gzip 不仅可以用来压缩大的、较少使用的文件以节省磁盘空间,还可以和 tar 命令一起构成 Linux 操作系统中比较流行的压缩文件格式。据统计,gzip 命令对文本文件有 60%~70% 的压缩率。注意:gzip 不会打包文件,压缩的过程源文件会对应变为 ".gz" 格式的压缩文件 (源文件被删除),解压缩的过程将 ".gz" 格式的压缩文件再恢复成对应的源文件。基本信息如下:

  • 命令名称:gzip
  • 英文原意:compress or expand files
  • 所在路径:/bin/gzip
  • 执行权限:所有用户
  • 功能描述:压缩或解压缩 ".gz" 格式的文件或目录

命令格式:gzip [选项] 源文件

  • 选项:

    • -d:执行解压缩
    • -r:递归处理,将指定目录下的所有文件及子目录一并处理
    • -c:将压缩数据输出到标准输出中,可以保留源文件

      • 使用 "-c" 选项,压缩数据会直接输出到屏幕上,为了不让压缩数据输出到屏幕上而是重定向到压缩文件中,并且同时保留源文件,命令可以这样写:gzip -c abc > abc.gz
    • -l:列出压缩文件的相关信息

8.2.2 gunzip 命令

gunzip 命令用来解压缩 ".gz" 格式的文件 (即使用 "gzip" 命令压缩的文件),作用相当于 "gzip -d 压缩文件",因此不论是压缩或解压缩,都可通过 "gzip" 指令单独完成。基本下信息如下:

  • 命令名称:gunzip
  • 英文原意:expand files
  • 所在路径:/bin/gunzip
  • 执行权限:所有用户
  • 功能描述:解压缩 ".gz" 格式的文件或目录

命令格式:gunzip [选项] 压缩文件

  • 选项:

    • -r:递归处理,将指定目录下的所有文件及子目录一并处理
    • -c:把解压后的文件数据输出到标准输出中,可以保留压缩文件
    • -l:列出压缩文件的相关信息

8.3 ".bz2" 格式

".bz2" 格式是 Linux 的另一种压缩格式,从理论上来讲,".bz2" 格式的算法更新进、压缩比更好;而 ".gz" 格式相对来讲压缩的时间更快

8.3.1 bzip2 命令

bzip2 命令是 ".bz2" 格式文件的压缩和解压缩命令。注意:"bzip2" 不能用来压缩目录。基本信息如下:

  • 命令名称:bzip2
  • 英文原意:a block-sorting file compressor
  • 所在路径:/usr/bin/bzip2
  • 执行权限:所有用户
  • 功能描述:压缩或解压缩 ".bz2" 格式的文件

命令格式:bzip2 [选项] 源文件

  • 选项:

    • -d:执行解压缩
    • -k:压缩或解压缩后,会删除原始文件,若要保留原始文件,请使用此参数
    • -f:在压缩或解压缩时,若输出文件与现有文件同名,强制覆盖现有文件
    • -c:将压缩与解压缩的数据输出到标准输出中

8.3.2 bunzip2 命令

bunzip2 命令用来解压缩 ".bz2" 格式的文件 (即使用 "bzip2" 命令压缩的文件),作用相当于 "bzip2 -d 压缩文件",因此不论是压缩或解压缩,都可通过 "bzip2" 指令单独完成。基本信息如下:

  • 命令名称:bunzip2
  • 英文原意:a block-sorting file compressor
  • 所在路径:/usr/bin/bunzip2
  • 执行权限:所有用户
  • 功能描述:解压缩 ".bz2" 格式的文件

命令格式:bunzip2 [选项] 压缩文件

  • 选项:

    • -k:bzip2 在解压缩后,会删除原始压缩文件,若要保留原始压缩文件,请使用此参数
    • -f:解压缩时,若输出的文件与现有文件同名时,强制覆盖现有的文件
    • -c:将解压缩的数据输出到标准输出中

8.4 ".tar"、".tar.gz"、".tar.bz2" 格式

tar 命令可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。注意:打包和压缩是两个不同的概念,打包是指将一大堆文件或目录变成一个总的文件;压缩则是将一个大的文件通过一些压缩算法变成一个小文件。为什么要区分这两个概念呢?这源于 Linux 中很多压缩程序 (gzip、bzip2) 只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包(tar),然后再用压缩程序进行压缩。tar 命令基本信息如下:

  • 命令名称:tar
  • 英文原意:tar
  • 所在路径:/usr/bin/tar
  • 执行权限:所有用户
  • 功能描述:打包与解打包文件

命令格式:
打包tar -c [选项] [-f 包文件名] 源文件或目录
解打包tar -x [选项] -f 包文件名

  • 选项:

    • -c:执行打包
    • -x:执行解打包
    • -z:支持压缩和解压缩 ".tar.gz" 格式文件
    • -j:支持压缩和解压缩 ".tar.bz2" 格式文件
    • -C 目录路径:指定解打包位置
    • -f 包文件名: 指定打包文件名 (.tar) 或压缩包文件名(.tar.gz、.tar.bz2)。(执行打包时不写此选项,会默认把打包数据输出到屏幕)
    • -v: 显示打包或解打包过程
    • -t:测试,就是不解打包,只是查看包中有哪些文件

示例:

#=======================".tar"格式=========================
#打包不会压缩
[root@localhost ~]# tar -cvf anaconda-ks.cfg.tar anaconda-ks.cfg
#解打包到当前目录
[root@localhost ~]# tar -xvf anaconda-ks.cfg.tar
#解打包到指定目录
[root@localhost ~]# tar -xvf anaconda-ks.cfg.tar -C /testdir/

#=====================".tar.gz"格式=====================
#把/tmp/目录直接打包并压缩为".tar.gz"格式
[root@localhost ~]# tar -zcvf tmp.tar.gz /tmp/
#解压缩并解打包".tar.gz"格式文件
[root@localhost ~]# tar -zxvf tmp.tar.gz

#=====================".tar.bz2"格式=====================
#把/tmp/目录直接打包并压缩为".tar.bz2"格式
[root@localhost ~]# tar -jcvf tmp.tar.gz /tmp/
#解压缩并解打包".tar.bz2"格式文件
[root@localhost ~]# tar -jxvf tmp.tar.gz

9 关机和重启命令

9.1 sync 数据同步

sync 命令用于强制被改变的内容立刻写入磁盘。在 Linux/Unix 系统中,在文件或数据处理过程中一般先放到内存缓冲区中,等到适当的时候再写入磁盘,以提高系统的运行效率。sync 命令则可用来强制将内存缓冲区中的数据立即写入磁盘中。用户通常不需执行 sync 命令,系统会自动执行 update 或 bdflush 操作,将缓冲区的数据写入磁盘。只有在 update 或 bdflush 无法执行或用户需要非正常关机时,才需手动执行 sync 命令。基本信息如下:

  • 命令名称:sync
  • 英文原意:flush file system buffers
  • 所在路径:/bin/sync
  • 执行权限:所有用户
  • 功能描述:刷新文件系统缓冲区

命令格式:sync [选项]

9.2 shutdown 命令

shutdown 命令用来系统关机。shutdown 指令可以关闭所有程序,并依用户的需要,进行重新开机或关机的动作。基本信息如下:

  • 命令名称:shutdown
  • 英文原意:bring the system down
  • 所在路径:/sbin/shutdown
  • 执行权限:超级用户
  • 功能描述:关机和重启

命令格式:shutdown [选项] 时间 [警告信息]

  • 选项:

    • -c:取消将要执行的 shutdown 命令
    • -h:系统关机
    • -r:系统重启
  • 时间:now 立即执;hh:mm 指定确定时间点执行;+分钟数 延迟指定分钟后执行
  • 警告信息:执行指令时,同时送出警告信息给登入用户

示例:

#立即关机
[root@localhost ~]# shutdown -h now
#指定5分钟后关机,同时送出警告信息给登入用户:
[root@localhost ~]# shutdown +5 "System will shutdown after 5 minutes"

9.3 reboot 命令

reboot 命令用来重新系统,命令也是安全的,而且不需要过多的选项

  • 命令名称:reboot
  • 英文原意:reboot
  • 所在路径:/sbin/reboot
  • 执行权限:超级用户
  • 功能描述:重启系统

命令格式:reboot [选项]

  • 选项:

    • -d:重新开机时不把数据写入记录文件 / var/tmp/wtmp。本参数具有 “-n” 参数效果;
    • -f:强制重新开机,不调用 shutdown 指令的功能;
    • -i:在重开机之前,先关闭所有网络界面;
    • -n:重开机之前不检查是否有未结束的程序;
    • -w:仅做测试,并不真正将系统重新开机,只会把重开机的数据写入 / var/log 目录下的 wtmp 记录文件。

9.4 halt 和 poweroff 命令

halt 和 poweroff 这两都是系统关机命令,直接执行即可。但是两个命令不会完整关闭和保存系统的服务,不建议使用。

9.5 init 命令

init 命令是修改 Linux 运行级别的命令,是 Linux 下的进程初始化工具,init 进程是所有 Linux 进程的父进程,它的进程号为 1。也可以用于关机和重启,这个命令并不安全,不建议使用

命令格式:init [选项] 系统运行级别

  • 选项:

    • -b:不执行相关脚本而直接进入单用户模式
    • -s:切换到单用户模式

示例:

#关机,也就是调用系统的0级别
[root@localhost ~]# init 0
#重启,也就是调用系统的6级别
[root@localhost ~]# init 6

Linux 有 7 个系统运行级别

运行级别含义
0关机
1单用户模式,可以想象为 Windows 的安全模式,主要用于系统修复
2不完全的命令模式,不含 NFS 服务
3完全的命令模式,就是标准字符界面
4系统保留,没有用到
5图形模式
6重启动
runlevel 命令可查看当前系统运行级别

10 常用网络命令

10.1 配置 IP 地址

IP 地址是计算机在互联网中唯一的地址编码,每台计算机如果需要接入网络和其他计算机进行数据通信,就必须配置唯一的 IP 地址

IP 地址的配置有两种方法:

  • setup 工具
  • 手工修改网卡配置文件

    • 第一步:编辑网卡文件,vi /etc/sysconfig/network-scripts/ifcfg-eth0,"ifcfg-eth0" 是第一块网卡,第二块网卡则为 "ifcfg-eth1",以此类推。网卡文件内容配置项如下:

      • DEVICE=eth0 #网卡设备名
      • BOOTPROTO=static #[none|static|bootp|dhcp](引导时不使用协议 | 静态分配 | BOOTP 协议 | DHCP 协议)
      • HWADDR=00:15:5D:00:46:83 #MAC 地址
      • UUID=5753e2ed-add1-4d1c-8a69-21a89647b050 # 唯一识别码
      • NM_CONTROLLED=yes #是否可以由 Network Manager 图形管理工具托管
      • ONBOOT=yes #[yes|no],是否随网络服务启动,如果配置 "no",使用 "ifconfig" 命令时看不到该网卡
      • TYPE=Ethernet # 网络类型
      • IPADDR=192.168.1.10 #IP 地址
      • NETMASK=255.255.255.0 #子网掩码
      • NETWORK=192.168.1.0 #网络地址
      • BROADCAST=192.168.1.255 #广播地址
      • GATEWAY=192.168.1.1 #网关地址
      • DNS1=202.109.14.5 #首选 DNS 服务地址
      • DNS2=219.141.136.10 #备用 DNS 服务地址
      • USERCTL=no #[yes|no](非 root 用户是否可以控制该设备)
    • 第二步:查看 DNS 服务配置文件,vim /etc/resolv.conf,里面的内容是系统自动生成的,一般不需要修改
    • 第三步:重启网络服务,service network restart/etc/init.d/network restart
注意:使用虚拟机克隆时,UUID 可能复制的是一样的,导致网络服务启动失败,需要重置 UUID 值:
第一步:编辑网卡文件,删除 UUID 和 MAC 地址
第二步: 删除 MAC 地址和 UUID 绑定文件,rm -rf /etc/udev/rules.d/70-persistent-net.rules
第三部:重启系统

10.2 ifconfig 命令

ifconfig 被用于配置和显示 Linux 内核中网络接口的网络参数。用 ifconfig 命令配置的网卡信息,在网卡重启后机器重启后,配置就不存在,要想将上述的配置信息永远的存的电脑里,那就要修改网卡的配置文件了。基本信息如下:

  • 命令名称:ifconfig
  • 英文原意:configure a network interface
  • 所在路径:/sbin/ifconfig
  • 执行权限:超级用户
  • 功能描述:配置网络接口

命令格式:ifconfig [参数]

  • 参数:

    • add 地址:设置网络设备 IPv6 的 ip 地址;
    • del 地址:删除网络设备 IPv6 的 IP 地址;
    • down:关闭指定的网络设备;
    • <hw<网络设备类型><硬件地址>:设置网络设备的类型与硬件地址;
    • io_addr I/O地址:设置网络设备的 I/O 地址;
    • irq IRQ地址:设置网络设备的 IRQ;
    • media 网络媒介类型:设置网络设备的媒介类型;
    • mem_start 内存地址:设置网络设备在主内存所占用的起始地址;
    • metric 数目:指定在计算数据包的转送次数时,所要加上的数目;
    • mtu 字节:设置网络设备的 MTU;
    • netmask 子网掩码:设置网络设备的子网掩码;
    • tunnel 地址:建立 IPv4 与 IPv6 之间的隧道通信地址;
    • up:启动指定的网络设备;
    • IP地址:指定网络设备的 IP 地址;
    • 网络设备:指定网络设备的名称。

ifconfig 命令最主要的作用就是查看 IP 地址的信息,直接输入ifconfig命令即可显示激活状态的网络设备信息:

[root@localhost ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:16:3E:00:1E:51  
          inet addr:10.160.7.81  Bcast:10.160.15.255  Mask:255.255.240.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:61430830 errors:0 dropped:0 overruns:0 frame:0
          TX packets:88534 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:3607197869 (3.3 GiB)  TX bytes:6115042 (5.8 MiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:56103 errors:0 dropped:0 overruns:0 frame:0
          TX packets:56103 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:5079451 (4.8 MiB)  TX bytes:5079451 (4.8 MiB)

内容说明:

  • eth0 表示第一块网卡,其中 HWaddr 表示网卡的物理地址,可以看到目前这个网卡的物理地址 (MAC 地址)是 00:16:3E:00:1E:51
  • inet addr 用来表示网卡的 IP 地址,此网卡的 IP 地址是 10.160.7.81,广播地址 Bcast:10.160.15.255,掩码地址 Mask:255.255.240.0
  • lo 是表示主机的回环地址,这个一般是用来测试一个网络程序,但又不想让局域网或外网的用户能够查看,只能在此台主机上运行和查看所用的网络接口。比如把 httpd 服务器的指定到回环地址,在浏览器输入 127.0.0.1 就能看到你所架 WEB 网站了,但只是本机能看得到,局域网的其它主机或用户无从知道

    • 第一行:连接类型:Ethernet(以太网)HWaddr(硬件 mac 地址)
    • 第二行:网卡的 IP 地址、子网、掩码
    • 第三行:UP(代表网卡开启状态)RUNNING(代表网卡的网线被接上)MULTICAST(支持组播)MTU:1500(最大传输单元):1500 字节
    • 第四、五行:接收、发送数据包情况统计
    • 第七行:接收、发送数据字节数统计信息

其他示例:

#启动和关闭网卡eth0。关闭网卡eth0,ssh登陆linux服务器操作要小心,关闭了就不能开启了,除非你有多网卡
[root@localhost ~]# ifconfig eth0 up
[root@localhost ~]# ifconfig eth0 down

#为网卡eth0配置IPv6地址
[root@localhost ~]# ifconfig eth0 add 33ffe:3240:800:1005::2/64  
 #为网卡eth0删除IPv6地址
[root@localhost ~]# ifconfig eth0 del 33ffe:3240:800:1005::2/64 

#用ifconfig修改MAC地址
[root@localhost ~]# ifconfig eth0 hw ether 00:AA:BB:CC:dd:EE
#ifconfig配置IP地址
[root@localhost ~]# ifconfig eth0 192.168.2.10
[root@localhost ~]# ifconfig eth0 192.168.2.10 netmask 255.255.255.0
[root@localhost ~]# ifconfig eth0 192.168.2.10 netmask 255.255.255.0 broadcast 192.168.2.255

#启用和关闭arp协议
[root@localhost ~]# ifconfig eth0 arp   
[root@localhost ~]# ifconfig eth0 -arp

#设置最大传输单元,这里设置能通过的最大数据包大小为 1500 bytes
[root@localhost ~]# ifconfig eth0 mtu 1500 

10.3 ping 命令

ping 命令是常用的网络命令,主要通过 ICMP 协议进行网络探测,测试网络中主机的通信情况。基本信息如下:

  • 命令名称:ping
  • 英文原意:send ICMP ECHO_REQUEST to network hosts
  • 所在路径:/bin/ping
  • 执行权限:所有用户
  • 功能描述:向网络主机发送 ICMP 请求

命令格式: ping [选项] IP

  • 选项:

    • -b:用于对整个网段进行探测。IP 需要为广播地址
    • -c 次数:设置完成要求回应的次数
    • -s 字节数:设置数据包的大小

示例:

#探测整个网段中有多少主机是可以和本机通信的,而不是一个一个IP地址地进行探测
[root@localhost ~]# ping -b -c 3 192.168.199.255
WARNING: pinging broadcast address
PING 192.168.199.255 (192.168.199.255) 56(84) bytes of data.
64 bytes from 192.168.199.216: icmp_seq=1 ttl=64 time=77.7 ms
64 bytes from 192.168.199.131: icmp_seq=2 ttl=64 time=102 ms
64 bytes from 192.168.199.216: icmp_seq=3 ttl=64 time=19.5 ms

--- 192.168.199.255 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2023ms
rtt min/avg/max/mdev = 19.515/66.701/102.798/34.892 ms

10.4 netstat 命令

netstat 是网络状态查看命令,既可以查看到本机开启的端口,也可以查看哪些客户端连接。在 CentOS 7.x 中 netstat 命令默认没有安装,如果需要使用,需要先安装 "net-snmp" 和 "net-tools" 软件包。基本信息如下:

  • 命令名称:network
  • 英文原意:print network connections, routing tables, interface statistics, masquerade connections, and mulicast memberships
  • 所在路径:/bin/netstat
  • 执行权限:所有用户
  • 功能描述:打印网络连接、路由表、接口统计信息、伪装连接和多播成员身份

命令格式:netstat [选项]

  • 选项:

    • -a:列出所有网络状态,包括 Socket 程序
    • -c 秒数:制定每隔几秒刷一次网络状态
    • -n:使用 IP 地址和端口号显示,不使用域名与服务名
    • -p:显示 PID 和程序
    • -t:显示使用 TCP 协议端口的连接情况
    • -u:显示使用 UDP 协议端口的连接情况
    • -l:仅显示监听状态的连接
    • -r:显示路由表

示例 1:查看本机开启的端口
这是本机最常用的方式,使用 "-tuln" 选项。因为使用了 "-l" 选项,所以只能看到监听状态的连接,而不能看到已经建立连接状态的连接,

[root@localhost ~]# netstat -tuln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State            
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:11211               0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN
tcp        0      0 :::11211                    :::*                        LISTEN
tcp        0      0 :::80                       :::*                        LISTEN
tcp        0      0 :::22                       :::*                        LISTEN
udp        0      0 0.0.0.0:11211               0.0.0.0:* 
udp        0      0 :::11211                    :::*  

这个命令输出内容较多,下面对每列进行说明:

  • Proto:网络连接的协议,一般就是 TCP 协议或者 UDP 协议
  • Recv-Q:接收队列。表示接收到的数据,已经在本地的缓冲中,但是还没有被进程取走
  • Send-Q:发送队列。表示从本机发送,对方还没有收到的数据,依然在本地的缓冲中,一般是不具备 ACK 标志的数据包
  • Local Address:本机的 IP 地址和端口号。
  • Foreign Address:远程主机的 IP 地址和端口号。
  • State:状态。常见的状态主要有以下几种:

    • LISTEN:监听状态,只有 TCP 协议需要监听,而 UDP 协议不需要监听
    • ESTABLISHED:已经建立连接的状态。如果使用 “-l” 选项,则看不到已经建立连接的状态
    • SYN_SENT:SYN 发起包,就是主动发起连接的数据包
    • SYN_RECV:接收到主动连接的数据包
    • FIN_WAIT1:正在中断的连接
    • FIN_WAIT2:已经中断的连接,但是正在等待对方主机进行确认
    • TIME_WAIT:连接已经中断,但是套接字依然在网络中等待结束
    • CLOSED:套接字没有被使用
    • 在这些状态中,我们最常用的就是 LISTEN 和 ESTABLISHED 状态,一种代表正在监听,另一种代表已经建立连接

示例 2:查看本机有哪些程序开启的端口
如果使用 “-p” 选项,查询结果会多出一列 "PID/Program name",则可以查看到是哪个程序占用了端口,并且可以知道这个程序的 PID

[root@localhost ~]# netstat -tulnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address      Foreign Address     State      PID/Program name       
tcp        0      0 0.0.0.0:3306       0.0.0.0:*           LISTEN     2359/mysqld
tcp        0      0 0.0.0.0:11211      0.0.0.0:*           LISTEN     1563/memcached
tcp        0      0 0.0.0.0:22         0.0.0.0:*           LISTEN     1490/sshd
tcp        0      0 :::11211           :::*                LISTEN     1563/memcached
tcp        0      0 :::80              :::*                LISTEN     21025/httpd
tcp        0      0 :::22              :::*                LISTEN     1490/sshd
udp        0      0 0.0.0.0:11211      0.0.0.0:*                      1563/memcached
udp        0      0 :::11211           :::*                           1563/memcached

示例 3:查看所有连接
使用选项 “-an” 可以查看所有连接,包括监听状态的连接(LISTEN)、已经建立连接状态的
连接(ESTABLISHED)、Socket 程序连接等。因为连接较多,所以输出的内容有很多

[root@localhost ~]# netstat -an
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State            
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:11211               0.0.0.0:*                   LISTEN
tcp        0      0 117.79.130.170:80           78.46.174.55:58815          SYN_RECV
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN
tcp        0      0 117.79.130.170:22           124.205.129.99:10379        ESTABLISHED
tcp        0      0 117.79.130.170:22           124.205.129.99:11811        ESTABLISHED
...省略部分内容...
udp        0      0 0.0.0.0:11211               0.0.0.0:* 
udp        0      0 :::11211                    :::* 
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ACC ]     STREAM     LISTENING     12668  /var/run/mcelog-client
unix  2      [ ACC ]     STREAM     LISTENING     12193  @/var/run/hald/dbus-ZeYsMXZ7Uf
...省略部分内容...

从 "Active UNIX domain sockets" 开始,之后的内容就是 Socket 程序产生的连接,之前的内容都是网
络服务产生的连接。我们可以在 “-an” 选项的输出中看到各种网络连接状态,而之前的 “-tuln” 选项则只能看到监听状态的连接

10.5 write 命令

write 命令用于向指定登录用户终端上发送信息。通过 write 命令可传递信息给另一位登入系统的用户,当输入完毕后,键入 "回车" 表示发送,键入 "Ctrl+C" 表示信息结束。如果接收信息的用户不只登入本地主机一次,你可以指定接收信息的终端机编号。基本信息:

  • 命令名称:write
  • 英文原意:send a message to another user
  • 所在路径:/usr/bin/write
  • 执行权限:所有用户
  • 功能描述:向其他用户发送消息

命令格式 :write 用户名 [终端编号]

  • 用户名:指定要接受信息的登录用户
  • 终端编号:指定接收信息的用户的登录终端,如果省略,且用户在多个终端登录,会发送给其中一个终端

10.6 wall 命令

wall 命令用于向系统当前所有打开的终端上输出信息,而 "write" 命令用于给指定用户发送消息。

命令格式:wall 消息

示例:

[root@localhost ~]# wall "I will be in 5 minutes to restart, please save your data"

11 系统痕迹命令

系统中有一些重要的痕迹日志文件,如 /var/log/wtmp、 /var/run/utmp、 /var/log/btmp、/var/log/lastlog 等日志文件,如果你用 vim 打开这些文件,你会发现这些文件是二进制乱码。这是由于这些日志中保存的是系统的重要登录痕迹,包括某个用户何时登录了系统,何时退出了系统,错误登录等重要的系统信息。这些信息要是可以通过 vim 打开,就能编辑,这样痕迹信息就不准确,所以这些重要的痕迹日志,只能通过对应的命令来进行查看。

11.1 w 命令

w 命令是显示系统中正在登录的用户信息的命令,这个命令查看的痕迹日志是 "/var/run/utmp"。基础信息如下:

  • 命令名称:w
  • 英文原意:show who is logged on and what they are doing
  • 所在路径:/usr/bin/w
  • 执行权限:所有用户
  • 功能描述:显示登录用户和他们正在做什么

命令格式:w [选项] [用户名]

  • 选项:

    • -h:不打印头信息;
    • -u:当显示当前进程和 cpu 时间时忽略用户名;
    • -s:使用短输出格式;
    • -f:显示用户从哪登录;
  • 用户:仅显示指定用户

示例:

[root@localhost ~]# w
 18:31:08 up 1 day, 16 min,  3 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1     -                Sat18   49:23   0.07s  0.07s -bash
root     pts/0    192.168.199.119  18:22    8:17   0.02s  0.02s -bash
root     pts/1    192.168.199.119  18:22    0.00s  0.03s  0.00s w

说明:

  • 第一行内容:

    • 18:31:08:系统当前时间
    • up 1 day, 16 min:系统的运行时间
    • 3 users:当前登录终端数量
    • load average: 0.00, 0.00, 0.00:系统在之前 1 分钟、5 分钟、15 分钟的平均负载。如果 CPU 是单核的,则这个数据超过 1 就是高负载;如果 CPU 是四核的,则这个数值超过 4 就是高负载
  • 第二行内容:

    • USER:当前登录的用户
    • TTY:登录的终端。tty1-6: 本地字符终端 (alt+F1-6 切换),tty7: 本地图形终端 (ctrl+F7 切换,必须安装启动图形界面),pts/0-255: 远程终端
    • FROM:登录的 IP 地址,如果是本地终端,则是空
    • LOGIN@:登录时间
    • IDLE:用户空闲时间
    • JCPU:所有的进程占用的 CPU 时间
    • PCPU:当前进程占用的 CPU 时间
    • WHAT:用户正在进行的操作

11.2 who 命令

who 命令和 w 命令类似,用于查看正在登录的用户,但显示的内容更加简单,也是查看 "/var/run/utmp" 日志。

命令格式:who [选项] [查询文件]

  • 选项:

    • -H:显示各栏位的标题信息列
    • -q:只显示登入系统的帐号名称和总人数
    • -w:显示用户的信息状态栏
    • -u:显示闲置时间,若该用户在前一分钟之内有进行任何动作,将标示成 "." 号,如果该用户已超过 24 小时没有任何动作,则标示出 "old" 字符串
  • 查询文件:指定要查询的文件,默认是 / var/run/utmp

11.3 last 命令

last 命令查看系统所有登录过的用户信息,包括正在登录的用户和之前登录的用户,这个命令查看的是 "/var/log/wtmp" 痕迹日志文件

命令格式:last [选项] [用户|终端]

  • 选项:

    • -a:把从何处登入系统的主机名称或 ip 地址,显示在最后一行
    • -d:将 IP 地址转换成主机名称
    • -f 记录文件:指定记录文件
    • -n 显示列数-显示列数:设置列出名单的显示列数
    • -R:不显示登入系统的主机名称或 IP 地址
    • -x:显示系统关机,重新开机,以及执行等级的改变等信息
  • 用户 | 终端:显示指定的用户或终端

11.4 lastlog 命令

lastlog 命令是查看系统中所有用户最好一次的登录时间的命令,这个命令查看的是 "/var/log/lastlog" 痕迹日志文件

命令格式:lastlog [选项]

  • 选项:

    • -b 天数:显示指定天数前的登录信息
    • -t 天数:显示指定天数以来的登录信息
    • -u 用户名:显示指定用户的最近登录信息

11.5 lostb 命令

lastb 命令是查看错误登录的信息的,查看的是 "/var/log/btmp" 痕迹日志

命令格式:lostb [选项] [用户|终端]

  • 选项:

    • -a:把从何处登入系统的主机名称或 ip 地址显示在最后一行
    • -d:将 IP 地址转换成主机名称
    • -f 记录文件:指定记录文件
    • -n 显示列数-显示列数:设置列出名单的显示列数
    • -R:不显示登入系统的主机名称或 IP 地址
    • -x:显示系统关机,重新开机,以及执行等级的改变等信息
  • 用户 | 终端:显示指定的用户或终端

  1. 0-9
gulp
2 评论
    10月31日回复

    华纳企业账户开户步骤?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】

    11月1日回复

    华纳东方明珠客服电话是多少?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
    华纳东方明珠开户专线联系方式?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
    如何联系华纳东方明珠客服?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
    华纳东方明珠官方客服联系方式?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
    华纳东方明珠客服热线?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
    华纳东方明珠开户客服电话?(▲182(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
    华纳东方明珠24小时客服电话?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
    华纳东方明珠客服邮箱?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
    华纳东方明珠官方客服在线咨询?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
    华纳东方明珠客服微信?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】