Linux是一种类似于UNIX的内核软件,用于对硬件设备的控制。
发行版=内核版+GNU软件+封闭源代码软件
bash是 Bourne Again Shell 的缩写,是linux默认的标准shell(也是大家常说的系统内核),bash也是Unix/Linux上常见的Shell脚本解释器,既然bash是标准的shell,那么就有非标准的sh,csh,ksh等等,我们常说有多少种Shell,其实说的是Shell脚本解释器,Shell是一种脚本语言,那么,就必须有解释器来执行这些脚本,bash是基于Bourne shell创建的,并且吸收了C shell和Korn shell的一些特性,而且bash完全兼容sh,也就是说,用sh写的脚本可以不加修改的在bash中执行。
sh:sh 由Steve Bourne开发,是Bourne Shell的缩写,sh 是Unix 标准默认的shell。
ash:ash shell 是由Kenneth Almquist编写的,Linux中占用系统资源最少的一个小shell,它只包含24个内部命令,因而使用起来很不方便。
csh:csh 是Linux比较大的内核,它由以William Joy为代表的共计47位作者编成,共有52个内部命令。该shell其实是指向/bin/tcsh这样的一个shell,也就是说,csh其实就是tcsh。
ksh:ksh 是Korn shell的缩写,由Eric Gisin编写,共有42条内部命令。该shell最大的优点是几乎和商业发行版的ksh完全兼容,这样就可以在不用花钱购买商业版本的情况下尝试商业版本的性能了。
现在我们知道Unix/Linux上有多种shell,那我怎么知道当前使用的哪种shell呢,我们可以从当前进程中查看到这些信息。
分层的树形结构,挂载在根文件系统“/”下
目录 | 描述 |
---|---|
/ | Linux系统根目录 |
/home | 包含Linux系统上各用户的主目录,子目录名称默认以该用户名命名 |
/root | 是root用户的主目录 |
/bin | 包含常用的命令文件,不能包含子目录 |
/sbin | 包含系统管理员和root用户所使用的命令文件 |
/dev | 包含大部分的设备文件,比如磁盘、光驱等 |
/lib | 包含Linux系统的共享文件和内核模块文件。 |
/lib/modules | 目录存放核心可加载模块。 |
/lib64 | 包含64位版本Linux系统的共享文件和内核模块文件 |
/tmp | 包含一些临时文件 |
/mnt | 手动为某些设备(比如硬盘)挂载提供挂载目录 |
/boot | 包含Linux系统的内核文件和引导装载程序(如GRUB)文件 |
/opt | 包含某些第三方应用程序的安装文件 |
/media | 由系统自动为某些设备(一般为光盘、U盘等设备)挂载提供挂载目录 |
/var | 该目录存放经常变化的数据,如系统日志、打印队列、DNS数据库文件等 |
/etc | 包含Linux系统上大部分的配置文件,建议修改配置文件之前先备份 |
/usr | 包含可以供所有用户使用的程序和数据 |
/srv | 存储一些服务启动之后所需要取用的资料目录 |
/run | 一个临时文件系统,一些程序或服务启动以后,会将他们的PID放置在该目录中 |
字符界面关机和重启
shutdown [选项] [时间] [警告信息]
选项:
例:发出关机警告信息,并不会关机
user01@ubuntu:~$sudo shutdown -k
例:立即关机
user01@ubuntu:~$sudo shutdown –h now
例:45分钟后关闭计算机
user01@ubuntu:~$sudo shutdown –h +45
例:重启计算机并发出警告
user01@ubuntu:~$sudo shutdown –r now “system will be reboot now.”
例:定时在1点38分重启计算机
user01@ubuntu:~$sudo shutdown –r 01:38
halt [选项]
-w 并不会关机,将关机信息写入到/var/log/wtmp文件中
-d 关闭系统,不把记录写到/var/log/wtmp日志文件中
-f 不调用shutdown而强制关闭系统
reboot [选项]
历史命令:
history [参数]
命令的参数可以由另外一个命令的结果来替代
(1)使用“$( )”
命令语法:
命令1 $(命令2)
(2)使用“ ’’”
命令语法:
命令1 ‘命令2’
例如:
user01@ubuntu:~$ pidof less
7552
user01@ubuntu:~$ kill 7552
例如:
user01@ubuntu:~$ kill $(pidof less)
user01@ubuntu:~$ kill `pidof less`
自定义别名:
1、创建别名
alias命令。如果命令中有空格的话,就需要使用双引号(比如在命令与选项之间就有空格)。
命令语法:
alias [别名]=[需要定义别名的命令]
2、取消别名
unalias命令。
命令语法:
unalias [别名]
举例:请设置别名使得用户快速进入目录
/home/user01/program/cplus
设置别名之前,用户需使用如下命令进入该目录:
cd /home/user01/program/cplus
设置别名:
alias work=“cd /home/user01/program/cplus”
取消别名:
unalias work
cd [目录]
用户可以使用cd(change directory)命令改变当前工作目录,即将从当前工作目录切换至cd命令中参数指定的目录。
user01@ubuntu:~$cd chapter03
user01@ubuntu:~/chapter03$。
cd … 转到当前目录的上层目录
cd ~ 转到当前用户的家目录
cd …/…/ 转到当前目录的上上层目录
绝对路径从/(根)开始,然后循序到所需的目录下
相对路径从当前目录开始
问题:若用户当前在/etc目录下,如何输入命令使得用户进入/var目录?
绝对路径方法: cd /var
相对路径方法: cd …/var
显示当前目录:pwd
ls命令语法:
ls [选项] [目录|文件]
常用选项:
mkdir命令语法:
mkdir [选项] [目录]
常用选项
创建一个目录
user01@ubuntu:~\$ mkdir a
创建多个目录
user01@ubuntu:~\$ mkdir a b c d
创建目录时指定目录权限
user01@ubuntu:~\$ mkdir -m 777 a
强制创建目录
user01@ubuntu:~\$ mkdir -p a/b/c
cp:复制文件或目录到其它目录中(copy)。
cp命令语法:
cp [选项] [源文件|目录] [目标文件|目录]
复制文件file1并重命名为file2
user01@ubuntu:~$ cp file1 file2
复制文件或目录到其它目录中。
命令语法:
cp [选项] [源文件|目录] [目标文件|目录]
复制文件file1到/tmp中并重命名为file2
user01@ubuntu:~$ cp file1 /tmp/file2
复制文件或目录到其它目录中。
命令语法:
cp [选项] [源文件|目录] [目标文件|目录]
复制目录/tmp到目录/tmp/hadoop下
user01@ubuntu:~$ cp –r /tmp /home/hadoop
更改文件或目录名称
命令语法:
mv [选项] [源文件|目录] [目标文件|目录]
将文件file1重命名为file2
mv file1 file2
将/tmp目录下的pic重命名为pic2
mv /tmp/pic /tmp/pic2
移动文件或目录
将pic目录下的所有以png结尾的文件移动到/usr/local/share/pic下
mv /tmp/pic/*.png /usr/local/share/pic
将/tmp目录下的pic移动到/usr/local/share/pic
mv /tmp/pic /usr/local/share/pic
rm命令:删除系统中的文件或目录。
命令语法:
rm [选项] [文件|目录]
rm命令:删除系统中的文件或目录。
删除指定文件 rm file
删除指定目录,删除时需要用户确认 rm -r folder
删除指定目录,删除时不需要用户确认 rm -rf folder
rmdir
命令语法:rmdir 目录名
文件的保护方式
用户分类:文件拥有者(user)、同组用户(group)、其他用户(others)
三种权限:读®、写(w)、执行(x)
设定文件的权限(字符设定法)
语法:chmod [who] [+ | - | =] [mode] 文件名
说明:[who]可是下述字符中的一个或它们的组合:
字符设定法
设定文件test1的属性为:文件属主(u)增加执行权限,与文件属主同组用户(g)增加执行权限,其他用户(o)增加执行权限。
$ chmod a+x test1
设定文件test2的属性为:文件属主(u)增加写权限,与文件属主同组用户(g)增加写权限,其他用户(o)删除写、执行权限。
$ chmod ug+w,o-wx test2
字符设定法
删除文件test3的执行权限,以下三个命令均可。
$ chmod a-x test3
$ chmod -x test3
$ chmod ugo-x test3
把文件test4的执行权限改为rwxrw-rw-
$ chmod u=rwx,g=rw,o=rw test4
数值设定法->数值计算:r:4, w:2, x:1
语法:chmod 数值 文件名
文件aaa的属性为文件属主(u)拥有读、写权限,与文件属主同组用户(g)拥有读权限,其他人(o)拥有读权限。
$ chmod 644 aaa
设定bbb这个文件的属性为:文件属主(u)可读/可写/可执行权,与文件属主同组用户(g)可读/可执行权,其他人(o)没有任何权限。
$ chmod 750 bbb
cat:查看文件,在屏幕上显示文件
语法:cat [选项] 文件名
选项:
-n 显示出行号
-A 显示文件中所有字符,包括隐藏字符
more:分页显示文件内容
语法:more 文件名
读完文件再显示
按空格往前翻页
ctrl+f往前翻页
ctrl+b往后翻页
按q键退出所查看的文件
less:分页显示文件内容
语法:less 文件名
边读边显示,启动快
按空格往前翻页
ctrl+f往前翻页
ctrl+b往后翻页
按q键退出所查看的文件
less扩展了more命令的功能
查看文件头几行数据:了解文件中数据格式
Windows需要将文件全打开才能看到数据
head [-n number] file
-n : 后面接数字,代表显示文件几行的意思
head –n 15 test //查看test文件的前15行
head test //默认输出前10行
查看文件末尾数据:多用于查看系统日志
tail [-n number] file
-n : 后面接数字,代表显示文件几行的意思
tail –n 15 test //查看test文件的末尾15行
tail test // 默认输出末尾10行
通配符:用符号来匹配一个或多个字符
?:代表任何一个字符
*:代表任何字符串
[字符组合]:在中括号中的字符都符合,譬如: [a-z]代表任意一个小写字母
[!字符组合]:不在中括号中的字符都符合,譬如: [!0-9]代表任意一个非数字字符
文件名匹配使得用户不必一一写出文件名称就可以指定多个文件。
例:删除当前目录下以 .bak结尾的文件
[user01@ubuntu~]$ rm *.bak
例:删除文件名中包含字符4且以 .bak结尾的文件
[user01@ubuntu~]$ rm *4*.bak
例:删除当前目录下扩展名有四个字符的文件
[user01@ubuntu~]$ rm *.????
例:删除文件首字母为a、b或c,且扩展名为.txt的文件
[user01@ubuntu~]$ rm [abc]*.txt
练习:删除文件名以数字字符开头,且文件扩展名为两个字符的文件。
[user01@ubuntu~]$ rm [0-9]*.??
管道命令:
管道:用符号“|”来标识。
用途:连接两个命令,将前一个命令的输出结果作为后一个命令的输入。
命令语法:[命令1]|[ 命令2]|[ 命令3]
命令1的输出作为命令2的输入,命令2的输出作为命令3的输入。
| 像一个筛子。
例:查看/etc目录下的文件,并将结果分页显示
[root@ubuntu~]# ls /etc | more
例:查看系统中已安装软件中软件名包含字符 ’a’的所有软件,输出结果分页显示
[root@ubuntu ~]#dpkg –l | grep a |more
**什么是数据流?**一组有顺序的、有起点和终点的字节集合。类别分为三种:标准输入(stdin),标准输出(stdout)和标准错误输出(stderr)
什么是数据流重定向? 改变数据传输道路 包括输出和输入重定向
输出重定向:将原本要输出到显示器上的信息输出(保存)到文件中
类型 | 符号 | 作用 |
---|---|---|
标准输出重定向 | 命令>文件 | 以覆盖的方式,把命令的正确输出结果输出到指定的文件 |
命令>>文件 | 以追加的方式,把命令的正确输出结果输出到指定的文件 | |
标准错误输出重定向 | 命令 2>文件 | 以覆盖的方式,把命令的错误输出结果输出到指定的文件 |
命令 2>>文件 | 以追加的方式,把命令的错误输出结果输出到指定的文件 |
命令出错时的输出重定向(覆盖)
user01@ubuntu:~\$ ls -l /etca 2> error
user01@ubuntu:~\$ cat error <=查看文件error
ls: 无法访问’/etca’: 没有那个文件或目录
命令出错时的输出重定向(追加)
user01@ubuntu:~\$ ipconfig 2>> error
命令运行正确时重定向到right,出错时的重定向到error
user01@ubuntu:~$ ls -l /etca >right 2> error
正确输出和错误错误输出同时保存
命令>文件 2>&1 = 命令 &>文件 :以覆盖的方式,把正确输出和错误结果输出到同一个文件
命令>>文件 2>&1 = 命令 &>>文件 :以追加的方式,把正确输出和错误结果输出到同一个文件
将ls命令运行结果重定向到right_error(覆盖)
user01@ubuntu:~$ ls -l /etc > right_error 2>&1
user01@ubuntu:~$ ls -l /etc &> right_error
将ls命令运行结果重定向到right_error(追加)
user01@ubuntu:~$ ls -l /etc >> right_error 2>>&1
user01@ubuntu:~$ ls -l /etc &>> right_error
输入重定向
user01@ubuntu:~$wc [选项] [文件名]
选项: -l 统计行数
-w 统计单词数
-c 统计字节数
统计用户从键盘输入字符所占行数、单词数以及字节数
user01@ubuntu:~\$ wc
hello world he
she him how are
you
3 8 35
统计文件test 的行数、单词数以及字节数
user01@ubuntu:~$ wc < test
sort命令 语法:sort [选项] 文件名
功能:对文件中的文本默认按字典序从小到大进行排序,并将结果显示出来。
选项:
-n 按数值大小排序
-u 对排序后相同的行只保留一行
-r 按逆序输出排序结果
例:对文件file1以倒序形式排序并显示在屏幕上。
$sort –r file1 或 cat file1 | sort -r
例:对文件file1排序并删掉重复的行。
$sort –u file1 或 cat file1 | sort -u
例:对数值文件file2按数值从小到大进行排序。
$sort –n file2 或 cat file2 | sort -n
uniq 命令:将重复行从文件中删除,并显示结果
语法:uniq [选项] 文件名
功能:使用uniq命令可以将排序后文件内的重复行数据从输出文件中删除,只留下每条记录的唯一样本。
选项:
-d 只显示重复行
-u 只显示不重复的行
例:使用uniq命令对文件file1去重后输出。
$sort file1 | uniq
例:查看文件file1中重复的数据内容。
$sort file1 | uniq -d
例:查看文件file1中不重复的数据内容。
$sort file1 | uniq -u 来显示当前工作目录的
grep命令:查找文件里符合条件的字符串
语法: grep [选项] [字符串] 文件名
选项:
-c:只显示匹配的行数;
-I:忽略字母大小写;
-n:输出时加行号;
-v:反转查找。
例:在adduser.conf文件中,查找不含“#”的行并列出行号
$ grep -vn “#” /etc/adduser.conf
例:在adduser.conf文件中,查找含有adduser字符的行数
$ grep -c adduser /etc/adduser.conf
cut 命令 语法: cut -f List -d Character 文件
功能: 从文件每行中选出指定的字节、字符或字段
-f 获取被定界符隔开后指定的字段列表
-d 指定分隔字符。
d代表delimeter , f代表field
例题:将 PATH 变量值取出,使用cut命令找出第五个路径。
$echo $PATH
/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11/bin:/usr/games:
# 1 | 2 | 3 | 4 | 5 | 6 | 7
$ echo $PATH | cut -d ':' -f 5
usr/local/bin
若想要列出第 3 与第 5 呢?
$ echo $PATH | cut -d ':' -f 3,5的
例:获取 export 命令输出信息的第 12 字符以后的内容:
$ export
declare -x HISTSIZE="1000"
declare -x INPUTRC="/etc/inputrc" declare -x KDEDIR="/usr"
declare -x LANG="zh_TW.big5"
.....(其他省略).....
$ export | cut -c 12-
HISTSIZE="1000"
INPUTRC="/etc/inputrc"
若要取12-20个字符?
cut -c 12-20
显示文件/etc/passwd中的用户登录名和用户名全称字段,$ cut –f 1,5 –d : /etc/passwd
文本比较
diff 命令 语法: diff [选项] 文件1 文件2
选项:
-c: 以context模式显示比较的结果,相对normal
-y: 以并列的方式显示文件的异同之处
-W:与选项-y一起使用,指定列宽
语法:find 目录 寻找条件操作
功能:在目录结构中搜索文件,并执行指定的操作。
寻找条件通常为:文件名称、文件属性、时间。
例:在/etc目录下,寻找以.conf结尾的文件
$find /etc –name *.conf
例:在当前目录下,查找属于user01用户的文件和目录
$find . –user user01
例:查找当前目录及其子目录下所有最近2天内更新过的文件。
$ find . -ctime -2
语法:locate -n N 文件名
选项:
-n 显示查找结果的个数
功能:从例行工作(crontab)程序创建的数据库中查找文件
例:查找文件passwd所在位置
$ locate passwd
例:查找文件passwd所在位置
$ locate passwd
locate
对于刚建立的文件,立即使用locate进行查找将会搜索不到所创建的文件,因为后台数据库一天更新一次;
若想使刚创建的文件能被立即搜索到,必须以root登陆,然后运行updatedb命令更新数据库。
语法: whereis [可选项] 要查找的字符串
选项:
-b 只查找二进制文件
-m 只查找说明文件
-s 只查找源代码文件
功能:查找指定文件、命令和手册页的位置
例:查找mkdir命令的所有信息。
$ whereis mkdir
例:查看mkdir命令的手册信息。
$ whereis -m mkdir
find:硬盘搜索,只要存在硬盘中就能找到。
locate:后台数据库中按文件名搜索,搜索速度比find更快。因数据库默认一天更新一次,新文件搜索不到。
whereis:根据文件名查找指定文件位置。
语法:gzip [可选项] 压缩(解压缩)的文件名
功能:对文件进行压缩和解压缩。压缩后,会自动在文件名后加上.gz扩展名,默认不保留原文件。
可选项
-c 将输出写到标准输出上,并保留原有文件
-d 将压缩文件解压
-r 递归式地查找指定目录并压缩、解压缩
用gzip命令将/home/lisi目录下的文件压缩
gzip /home/lisi/*
用命令将/home/lisi目录下所有的.gz文件解压缩
gzip -d /home/lisi/*
gunzip /home/lisi/*
语法:bzip2 [可选项] 文件名
功能:对目录和文件进行压缩或解压缩,压缩文件默认扩展名为bz2。
可选项
-d:解压缩选项。
-v:显示压缩或解压缩的过程。
-f:当文件重名时,进行覆盖。
使用bzip2命令压缩/home/lisi/目录下的文件。
bzip2 /home/lisi/*
使用bzip2命令解压缩/home/lisi/目录下的文件。
bzip2 -d /home/lisi/*
Linux系统下最常用的打包程序是tar,使用tar程序打出来的包称为tar包,通常都是以.tar结尾。
生成tar包后,就可以用其他的程序来进行压缩了。
tar可以为文件和目录创建备份,也可以在备份中改变文件,或者向备份中加入新的文件。
语法:tar [可选项] 文件或目录名
功能:将多个文件或目录打包成一个文件。
可选项
-z:用gzip命令进行压缩或解压缩
-j:通过 bzip2 进行压缩/解压缩
-C: 指定解压缩目录
-c:创建新的备份文件,备份目录或文件时必选项。
-f:对普通文件进行操作。这个选项通常是必选的。
-r:向备份档文件追加文件。
-x:从备份档文件中解出文件。
-t:列出备份文档中所含的文件。
-v: 列出处理过程中的详细信息
把/boot目录下文件和子目录打包,打包文件名为usr.tar。
tar -cvf usr.tar /boot
把/boot目录下的文件和子目录打包,并用gzip算法进行压缩,文件名为usr.tar.gz。
tar -zcvf usr.tar.gz
把usr.tar.gz这个打包文件还原并解压缩。
tar -zxvf usr.tar.gz
命令模式:底线、插入模式按ESC退出到命令模式
插入模式:按a,i,o 等文本插入
底线模式:按:建
一般指令模式:刚进入vi 时的默认模式。这个模式下能够进行:移动光标、整行的复制粘贴、整行删除 等基本操作。
编辑模式:在一般指令模式下,按 “a” “i” “o” 均可进入编辑模式。此模式下能够进行:文本的输入、删除。
命令行模式(末行模式):在一般指令模式下,按 “:” “/” “?” 均可进入命令行模式。由于此模式的输入会显示在窗口的最后一行,也叫末行模式。此模式下能够进行:搜索、保存、离开 等操作。
什么是Shell脚本?
利用shell的功能命令写成的一个“程序”;
类似于Windows下的批处理程序(.bat文件)。
Shell脚本的特点:适合对服务器管理;不适合做大量数值运算的任务。
Shell脚本运行
sh/bash 文件名
如: user01@ubuntu:~/scripts\$ sh sh01.sh
user01@ubuntu:~/scripts\$ bash sh01.sh
./文件名
先将文件变成可执行文件,如:chmod 711 sh01.sh
user01@ubuntu:~/scripts\$ ./sh01.sh
source 文件名
例:user01@ubuntu:~/scripts$ source sh01.sh
四种运行方式异同
sh/bash 文件名
创建子进程运行:程序运行完后程序中的变量失效
./文件名
创建子进程运行:程序运行完后程序中的变量失效
source 文件名
当前(父)进程运行:程序运行完后程序中的变量有效
Shell脚本运行过程
命令执行自上而下、自左向右;命令、参数间多个空白、空白行被忽略;程序中读到一个Enter符号(CR),就尝试开始执行该行命令;一行内容太多,可使用”[Enter]”来扩展至下行;
变量可以保存有用信息。
变量类别
本地变量:相当于局部变量,也称为用户自定义变量,是在当前shell环境,当前进程内有效的变量。
环境变量:相当于全局变量,也称为系统变量。它与本地变量的差别在于它可以用于所有用户进程。
预定义变量:相当于C语言中主函数变量,执行脚本程序时就被设定且不再改变。
变量的定义
本地变量设置格式:变量名=变量值
user01@ubuntu:~$ s1=hello
user01@ubuntu:~$ s2="hello world"
若等号两边有空格,则必须使用引号括起来。
变量的定义
环境变量设置格式:export 变量名=变量值
user01@ubuntu:~\$ export s1=hello
预定义变量是系统自带的变量,系统启动后即存在
变量的设置规则
变量与变量值以等号“=”来连接
等号两边不能直接接空格。
变量名称只能是英文字母、下划线与数字,但数字不能是开头字符。
若有空格,可以使用双引号或单引号将变量内容括起来。
变量的引用
引用变量时则应在变量名前加一个美元符号($)
user01@ubuntu:~\$ s1=hello
user01@ubuntu:~\$ s3=$s1
变量的显示
变量的显示使用echo命令,格式如下:
echo $变量名或 echo ${变量名} 或 echo “$变量名”
$ num=2
$ echo $num
$ echo “this is the \$numnd”
变量的数据读入
read命令,读取来自键盘输入的值并存入变量
语法:read [-pt] 变量名
可选项:
例:提示用户30秒内输入自己的名字,将该输入字符串存放在named变量中。
user01@ubuntu:~$ read –p “Please keyin your name:“ –t 30 named
Please keyin your name: linux
user01@ubuntu:~$ echo $named
linux
变量的释放
使用unset命令释放本地变量,格式如下:
unset 变量名
例:unset s1
环境变量
系统变量,全局变量,shell程序开始执行前已定义,用户可重新定义这些变量
使用env命令可以查看当前系统中定义的环境变量
user01@ubuntu:~$ env
常见的几个环境变量:HOME用户主工作目录 HOSTNAME主机名 USER用户名 COLUMNS每屏幕的列数 LINES每屏幕行数 PS1定义命令提示符显示效果 , user01@ubuntu:~$ PATH命令文件搜索目录。若用户输入的命令前没有加上路径指引,则系统会在此变量定义的搜索目录下依次寻找对应的可执行文件
预定义变量
预定义变量:相当于C语言中主函数参数,执行脚本程序时其值就被设定且不再改变;
所有的预定义变量都是由$和另一个符号组成的。
文件的存在性测试
test命令
文件的权限测试
-r 检测该文件是否存在且具有『可读』的权限?
-w 检测文件是否存在且具有『可写』的权限?
-x 检测文件是否存在且具有『可运行』的权限?
-u 检测文件是否存在且具有『SUID』的属性?
-g 检测文件是否存在且具有『SGID』的属性?
-k 检测文件是否存在且具有『Sticky bit』的属性?
-s 检测文件是否存在且为『非空白文件』?
如:test -r file
若当前目录下文件file可读,返回值为真,否则为假
test命令
文件的新旧测试
-nt (newer than)判断两个文件到底哪一个文件要新
-ot (older than)判断两个文件哪个文件要旧
-ef 判断两个文件是否为同一文件,可用于判断硬链接文件。
关于两个整数之间的判定:
-lt 测试n1 是否小于n2 (less than)
-ge 测试n1是否 大于等于n2 (greater than or equal)
-le 测试n1是否 小于等于n2 (less than or equal)
例如 test n1 -eq n2
若数值n1与n2相等,返回值为真,否则为假。
字符串测试
-z 用于测试字符串长度是否为0,若字符串为空,则返回true。
-n 用于测试字符串长度是否为非0,若字符串为非空,则返回true。
= 用于判断两个字符串是否相等,若相等则返回true。
!= 用于判断两个字符串是否不相等,若不相等,则返回true。
test -z string test str1 = str2 test str1 != str2
多重条件判定
-a 两种情况同时成立时才回传true。(and)
-o 两种情况任何一个成立就可回传true。(or)
! 反相状态
命令 test -r file -a -x file,表示file 同时具有r 与 x 权限时才回传true。
命令 test -r file -o -x file,表示file 具有r 或 x 权限时就回传true。
命令 test ! -x file ,表示file 不具有x权限 时,回传true。
条件判断符[]
能实现和test命令一样的功能;
为了与通配符区分,各元素间均有空格。
[□"$HOME"□==□"$MAIL"□] //判断两变量内容是否相等 □是空格
num1=100
num2=100
If [\$num1 -eq \$num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
语法一:
for((变量赋值; 条件判断; 变量迭代))
do
语句块1
done
编写一个程序,能在当前目录下创建10个以数值0-9为前缀,以.sh为扩展名的文件
#!/bin/bash
for((i=0; i<10; i++))
do
touch $i.sh
done
编写一个程序,打印乘法公式
#!/bin/bash
for((i=1; i<10; i++))
do
for((j=1; j<=i; j++))
do
echo -n “$j*$i=$(($i*$j)) “
if [ $i -eq $j ]
then
echo $‘\n’
fi
done
done
语法:
语句格式:
while [ 条件判断式 ]
do
语句块1
done
当用户输入break或者BREAK才结束程序执行,否则就一直告知用户输入字符串,并将用户输入字符串输出。
#!/bin/bash
while [ "$yn" != “break" -a "$yn" != “BREAK" ]
do
read -p “Please input a string : (break/Break to stop) " yn
echo You input a string : $yn
done
echo "OK! you interrupt the program."
一种新型的,非交互式的编辑器(vi编辑器为交互式)
sed 编辑器没有破坏性,它不会修改文件
默认输出到屏幕
sed工作过程
从文件中读入一行数据并把它保存在临时缓冲区中
处理临时缓冲区的内容,并将处理结果发送到显示器上
逐行处理文件所有内容直到最后一行
命令语法
sed [选项] ‘脚本’ 文件
选项
-n 使用安静模式
-e 多重编辑选项
-f 指定一个 sed 脚本文件到命令行执行
-r sed 使用扩展正则表达式
-I 直接修改文档读取的内容,不在屏幕上输出
例:将文件file中的A用you来替换。
$sed ‘s/A/you/’ file
XB 73 84 C
youL 80 95 B
BE 91 92 you
FC 50 61 E
例:在第一行前增加一行’ZS 90 85 B’,然后删除包含字符串” FC”的行。
$sed -e '1i ZS 90 85 B' -e '/FC/d' file
ZS 90 85 B
XB 73 84 C
AL 80 95 B
BE 91 92 A
命令语法
sed [选项] ‘脚本’ 文件
脚本
地址定位:用于确定处理哪些行
单地址: n,指定的行,如:sed ‘3s/A/you/’file
地址范围:n1,n2、n1,+n2、 /pat1/,/pat2/、 n1,/pat1/
/pat/:模式pat所能够匹配到的每一行
~:步进,1~2 奇数行、 2~2 偶数行
不给地址:对全文进行处理
将文件file中的/C/和/A/之间的A用you来替换。
$sed ‘/C/,/A/ s/A/you/’ file
XB 73 84 C
youL 80 95 B
BE 91 92 A
FC 50 61 E
命令语法
sed [选项] ‘脚本’ 文件
脚本
编辑命令:对文本进行增删改查等操作
a:在指定行后面追加文本;支持使用\n实现多行追加
i:在指定行前面插入文本
d:删除匹配的行
s:替换字符串, s///,s@@@,s###
c:替换匹配行
例:在文件file中的第一行后增加两行,”Hello Linux!\nHello sed!” 。
$sed ‘1a Hello Linux!\nHello sed!’ file
XB 73 84 C
Hello Linux!
Hello sed!
AL 80 95 B
BE 91 92 A
FC 50 61 E
删除文件file包含字符9的行。
$sed ‘/9/d’ file
XB 73 84 C
FC 50 61 E
将文件file中的字符串/bin/bash替换成/bin/csh。
$sed ‘s//bin/bash//bin/csh/’ file
sed: -e 表达式 #1, 字符 8: “s”的未知选项
将第3行用”Hello sed!”替换。
$sed ‘3c Hello sed’ file
XB 73 84 C
AL 80 95 B
Hello sed
FC 50 61 E
/bin/bash
将包含字符A的行用”Hello sed!”替换。
$sed ‘/A/c’ file
XB 73 84 C
Hello sed!
Hello sed!
FC 50 61 E
/bin/bash
脚本
sed正则中的元字符
^:表示行首
$:表示行尾
[a-z0-9]:表示字符范围
[^]:表示除了字符集中的字符以外的字符
. :表示任意字符
*:表示零个或者多个
将以字符A开头的行用”Hello sed!”替换。
$sed '/^A/c Hello sed!' file
XB 73 84 C
Hello sed!
BE 91 92 A
FC 50 61 E
/bin/bash
将以字符A的结尾的行用”Hello sed!”替换。
$sed ‘/A$/c Hello sed!' file
XB 73 84 C
AL 80 95 B
Hello sed!
FC 50 61 E
/bin/bash
将以字符A、B开头的行用”Hello sed!”替换。
$sed ‘/^[AB]/c Hello sed!' file
XB 73 84 C
Hello sed!
Hello sed!
FC 50 61 E
/bin/bash
什么是awk
一种便于使用且表达能力强的程序设计语言,适用于计算和数据处理任务
名称来源于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母
sed适用于在shell程序中对文本内容进行增删改查等操作
awk适用于计算和数据处理任务
命令语法
awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
awk命令运行过程
通过关键字BEGIN执行BEGIN后花括号{}后的内容
pattern部分匹配成功后,依次对该行执行pattern后花括号后的内容,循环读取文件直到文件结束。
开始 END 块执行,END 块可以输出最终结果。
打印出工作时间超过零小时的员工的姓名和工资(薪资乘以时间)。
awk '$3 >0 { print $1, $2 * $3 }’ file
打印出工作时间超过零小时的员工的姓名和工资,第一行输出字符串 NAME和SALARY 。
awk ‘BEGIN {print “NAME SALARY”} $3 >0 { print $1, $2 * $3 }’ file
打印出所有员工的姓名和工资。第一行输出字符串 NAME和SALARY,最后要输出员工数、付出的总薪酬以及员工的平均薪酬。
awk 'BEGIN {print "NAME SALARY"}
{ print $1, $2 * $3
pay=pay+$2*$3 }
END{ print NR, "employees"
print "total pay is", pay
print "average pay is", pay/NR
}' file
简单输出
打印所有行
{ print }、{ print $0 }
打印特定字段
{ print NF, $1, $3 }、NF表示一行中字段总数量
{ print NR, $0 }、NR表示行号
打印时进行计算
{ print $1, $2 * $3 }
输出中添加内容
{ print "total pay for", $1, "is", $2 * $3 }
awk '{print NR,NF,$1,$2*$3}' file
格式化输出
printf(format, value1, value2, ..., valuen)
跟C语言printf语句格式基本一致
按照format格式排列输出内容
awk '{ printf("%-8s $%6.2f\n", $1, $2 * $3) }' file
所谓磁盘分区指的是告诉操作系统“我这块磁盘在此分区可以访问的区域是从A扇区(柱面)到B扇区(柱面)之间的区域”;
硬盘各个分区范围的记录在硬盘的第一扇区的分区表中;
root@ubuntu ~# fdisk [-l] 设备名称
选项与参数:
-l :输出后面的设备中所有的 分区 内容。若仅有 fdisk -l命令时,则系统将会把整个系统内能够搜寻到的设备的分区均列出来。只有磁盘存在尚未分区的扇区才能进行分区。
列出系统中所有磁盘,并查阅磁盘的分区信息
root@ubuntu:/home/user01# fdisk –l
Disk /dev/sda:20 GiB,21474836480 字节,41943040 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xa267c83f
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sda1 * 2048 41940991 41938944 20G 83 Linux
列出系统中所有磁盘,并查阅磁盘的分区信息
root@ubuntu:/home/user01# fdisk -l
Disk /dev/sda:20 GiB,21474836480 字节,41943040 个扇区
…………
磁盘标签类型:dos
磁盘标识符:0xa267c83f
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sda1 * 2048 41940991 41938944 20G 83 Linux
Disk /dev/sdb:20 GiB,21474836480 字节,41943040 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
root@ubuntu:/home/user01# fdisk /dev/sdb
……
命令(输入 m 获取帮助): m
帮助:
……
常规
d 删除分区
n 添加新分区
p 打印分区表
w 将分区表写入磁盘并退出
q 退出而不保存更改
……
命令(输入 m 获取帮助): n
分区类型
p 主分区 (0个主分区,0个扩展分区,4空闲)
e 扩展分区 (逻辑分区容器)
选择 (默认 p): p
分区号 (1-4, 默认 1): 1
第一个扇区 (2048-41943039, 默认 2048):
上个扇区,+sectors 或 +size{K,M,G,T,P} (2048-41943039, 默认 41943039): +5G
创建了一个新分区 1,类型为“Linux”,大小为 5 GiB。
root@ubuntu:/home/user01# mount [-a] 设备文件名 挂载点
选项与参数:
mount无参数时,列出系统所有设备的挂载信息;
-a :依照配置文件 /etc/fstab 的设置将未挂载的磁盘都挂载上来
要查看Linux系统中的进程信息可以使用ps和top这两个命令。
语法:ps [可选项]
功能:使用 ps 命令查看系统的进程情况。该命令可以确定有哪些进程正在运行以及运行状态等。
可选项:
例1:查看当前进程状况。
# ps
例2:查看进程的详细情况。
# ps –u
[root@master ~]# ps -u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 692 0.0 0.0 110088 860 tty1 Ss+ 5月24 0:00 /sbin/agetty --noclear
例3:查看每位用户的全部进程。
\# ps –aux
[root@master ~]# ps -aux | grep crond
root 688 0.0 0.1 126280 1684 ? Ss 5月24 0:00 /usr/sbin/crond -n
root 20430 0.0 0.0 112724 984 pts/1 S+ 06:35 0:00 grep --color=auto crond
例4:查看当前进程状况。
# ps –u root
[root@master ~]# ps -u root
PID TTY TIME CMD
1 ? 00:00:01 systemd
2 ? 00:00:00 kthreadd
3 ? 00:00:00 ksoftirqd/0
例5:查看tty1终端下的进程。
# ps –t tty1
PID TTY TIME CMD
692 tty1 00:00:00 agetty
例6:查看进程号为1659的进程。
# ps –p 1659
PID:进程的ID号 内核给每个进程分配一个独一无二的ID号。 PID按照创建进程的顺序来分配,当内核用光了PID时,它就从1开始,并且跳过任何仍然在使用的PID。
Linux没有提供创建新进程去运行某个特定程序的系统调用。相反,现有进程必须克隆自身去创建一个新进程。
当一个进程被克隆时,原来的进程就叫做父进程,而副本则叫做子进程。进程的PPID属性就是克隆它的父进程的PID。
例如:在命令行运行bash命令创建一个子进程。
#bash
#pstree -p | grep bash
ps –axj 可以查看系统中各进程的父进程
系统监控命令 – top 命令
语法:top [可选项]
功能:使用top命令动态监控系统性能。top命令可以监控系统的内存、交换分区和CPU的使用率等,它会定期更新显示内容。
可选项:
-c:显示每个程序的完整指令。
-d <间隔秒数>:设置top执行状况的间隔时间,单位以秒计算。
-n <执行次数>:设置监控信息的更新次数。
在执行 top 的过程中,可以输入下面的字符进行排序。
A:以执行的先后顺序进行排序
T:由启动的时间进行排序
M:以所占的内存大小排序
P:以所耗用的 CPU 资源排序
例7:使用top命令动态显示进程信息。
# top
Tasks: 117 total, 2 running, 113 sleeping, %Cpu(s): 4.0 us, 2.7 sy, 0.0 ni, 93.3 id, KiB Mem : 997956 total, 134652 free, 36KiB Swap: 2097148 total, 2097148 free,
PID USER PR NI VIRT RES
64344 65534 20 0 157340 48960
1628 root 20 0 9048 4588
例8:只显示进程号为1659的进程。
# top –p 1659
例9:只显示root用户的进程。
# top –u root
要关闭某个应用程序可以通过结束其进程的方式实现,如果进程一时无法结束,可以将其强制结束。
如果将被终止的是一个后台进程,那么可以使用kill命令去杀死这个进程。
如果要终止一个前台运行的进程,按[Ctrl+C]键就可以终止该进程。
使用<ctrl+c>中断前台进程;
使用kill命令中断后台进程。
无条件kill命令: kill -9 <PID>
结束所有的后台进程:kill 0
例如,要终止系统中的named进程
先使用ps命令查看进程,得到named进程对应的PID(3576),使用kill命令来终止此进程:
# ps -aux | grep named
# kill 3576
固定时间触发某个作业,就需要创建任务计划,按时执行该作业——cron实现该功能;
cron实现任务计划方式:
可通过修改/etc/crontab文件;
使用crontab命令实现。
root用户通过修改/etc/crontab文件可以实现任务计划,而普通用户却无法修改该文件。
crond守护进程可以在无需人工干预的情况下,根据时间和日期的组合来调度执行重复任务。
/etc/crontab文件前面3行是用来配置cron任务运行环境的变量。
Shell变量的值告诉系统要使用哪个Shell环境(在这个例子里是/bin/bash);
PATH变量定义用来执行命令的路径;
cron任务的输出被邮寄给MAILTO变量定义的用户名。如果MAILTO变量被定义为空白字符串,电子邮件就不会被寄出。
root以外的用户可以使用crontab命令配置cron任务。
步骤:
以某位用户身份创建一个crontab项目,登录为该用户,然后输入crontab -e命令;
编辑该用户的crontab,该文件使用的格式和/etc/crontab相同。
当对crontab所做的改变被保存后(输入:wq),该crontab文件会根据该用户名被保存在/var/spool/cron/文件中。
crond守护进程每分钟都检查/etc/crontab文件、/etc/cron.d目录以及/var/spool/cron目录中的改变。如果发现了改变,它们就会被载入内存。
ifconfig ——>查看IP地址
ip addr ——>查看IP地址
ping ——>测试与目的地的连通性
traceroute ——>测试如何到达目的地
netstat ——>当前网络状态
【例12.2】 配置网卡ens33的IP地址, 同时激活该设备。
[root@master ~]# ifconfig ens33 192.168.237.140 netmask 255.255.255.0 up
【例12.3】 配置网卡ens33别名设备ens33:1的IP地址。
[root@master ~]# ifconfig ens33:1 192.168.237.140
【例12.4】 激活网卡ens33:1设备。
[root@master ~]# ifconfig ens33:1 up
【例12.5】 查看网卡ens33网络接口的配置。
[root@master ~]# ifconfig ens33
【例12.6】 查看所有的网卡网络接口配置。
[root@master ~]# ifconfig
使用ping命令可用于测试与目标计算机之间的连通性。
命令语法:
ping [选项] [目标]
使用traceroute命令可以显示数据包到目标主机之间的路径。
命令语法:
traceroute [选项] [主机名|IP地址] [数据包大小]
【例12.1】 跟踪从本地计算机到www.163.com网站的路径。
[root@master ~]# traceroute www.163.com
traceroute to www.163.com (210.35.186.124), 30 hops max, 60 byte packets
1 gateway (192.168.237.2) 0.150 ms 0.098 ms 0.098 ms
2 * * *
…
27 * * *
28 * * *
29 * * *
30 * * *