在Linux环境中,大小写字母是不一样的东西。
date 日期
date | 显示日期与时间 |
date +%Y/%m/%d 或 date +%H:%M | 设置格式显示日期与时间 |
date -s | 修改时间 date -s 01:59 |
cal 日历
cal [[month] year] | 显示日历 |
man 命令使用说明
man | 使用man来查看命令的用法,按q退出 |
man -f | 根据命令的名称查找命令的功能 |
man -k | 基于命令的功能来搜索命令名称 |
shutdown 关机命令
shutdown [-t] [-arkhncfF] 时间 [警告消息]
时间: now/20:25/+10(十分钟)
-t sec | -t后面加秒数,也即“过几秒后关机”的意思 |
-k | 不要真的关机,只是发送警告消息出去 |
-r | 在将系统的服务停掉后就立即重启(常用) |
-h | 将系统的服务停掉后,立即关机(常用) |
-c | 取消已经在进行的shutdown命令内容 |
reboot 重启
halt 关机
poweroff -f 关机
* halt会调用shutdown,而shutdown最后会调用halt。不过,shutdown可以依据目前已启动的服务来逐次关闭各服务后才关机;至于halt却能够在不理会目前系统状况下,进行硬件关机的特殊功能。
切换执行等级: init runlevel
runlevel:
0: 关机 3:纯命令行模式 5:含有图形界面模式 6:重启
su 变更用户
su username | 变更到其他用户【但改变用户时目录并没有发生改变,从本质上说环境变量没有变】 |
su | 变更成root用户(su root) |
su -l username | 变更到其他用户,包括其环境变量 |
su - | 变更成root用户,包括其环境变量(相当于 su -l root ) |
Linux文件属性
ls -l
drwx------ 3 root root 4096 Sep 5 10:37 .gconf
-rw-r--r-- 1 root root 42304 Sep 4 18:26 install.log
【权限】 【连接】【所有者】【用户组】】【文件容量】 【修改日期】【文件名】
说明:第一列代表这个文件的类型与权限,共10个字符,第一个字符代表这个文件是“目录、文件或连接文件等”,若是【d】则是目录,若是【-】则是文件,若是【l】则表示为连接文件,若是【b】则表示设备文件里面的可供存储的接口设备。若是【c】则表示设备文件里面串行端口设备,例如键盘、鼠标(一次性读取设备)。接下来的字符中,以3个为一组,且均为“rwx”的3个参数的组合。其中【r】代表读,【w】代表写,【x】代表可执行。要注意的是,这3个权限的位置不会改变,如果没有权限,就会出现减号【-】。第一组为“文件所有者的权限”,第二组为“同用户组的权限”,第三组为“其他非本用户组的权限”。
第二列表示有多少文件名连接到此节点(inode),每个文件都会将它的权限与属性记录到文件系统的inode中,不过我们使用的目录树却是使用文件名来记录,因此每个文件名就会连接到一个inode。这个属性记录的就是有多少不同的文件名连接到相同的一个inode码。也就是硬连接数。
第三列表示这个文件(或目录)的“所有者账号”。
第四列表示这个文件的用户组。
第五列为这个文件的容量大小,默认单位为B。
第六列为这个文件的创建文件日期或者是最近修改日期。
第七列为该文件名。如果文件名之前多一个“.”,则代表这个文件为“隐藏文件”,使用ls -a 可以查看隐藏文件。
改变文件属性与权限
chgrp 改变文件所属用户组
chgrp [-R] 用户组 dirname/filename
chown: 改变文件所有者
chown [-R] 账号名称 文件/目录
chown [-R] 账号名称:用户组 文件/目录
chown [-R] 账号名称.用户组 文件/目录
chmod 改变文件权限
chmod设置权限的方法有两种,分别可以使用数字或者符号来进行权限的更改。
1、数字类型:权限分为r、w、x,其中每种权限都有一个分值,r:4,w:2,x:1,每种身份(owner、group、other)各自的三个权限(r、w、x)分数是需要累加的,例如当权限为【-rwxrwx---】,分数则是owner=rwx=7,group=rwx=7,other=0,所以该文件的权限数字就是770,更改权限的命令:chmod [-R] xyz 文件或目录。
2、符号类型:chmod u(所有者) + r 文件或目录
g(用户组) - w
o (其他) = x
a (全部)
路径
相对路径:相对于目前路径的文件名写法。开头不是/写起的。
绝对路径: 由根目录(/)开始写起的文件名或目录名称。
. :代表当前的目录,也可以使用 ./ 来表示
.. : 代表上一层目录,也可以是 ../ 来表示
这个“.”与“..”目录概念是很重要的,你常常会看到cd.. 或 ./command之类的命令执行方式,就是代表上一层与目前所在目录的 工作状态。
-:代表前一个工作目录
~: 代表“目前用户身份”所在的主文件夹
~account: 代表account这个用户的主文件夹(account是个账号名称)
在Linux下面,根目录下有没有上层目录(..)存在?
使用ls -al 去查询,可以看到根目录下确实存在“.”与“..”两个目录,可以发现这两个目录的属性与权限完全一致,这代表根目录 的上一层(..)与根目录自己(.)是同一个目录。
cd 切换目录
cd [相对路径或绝对路径] | 切换路径 |
cd ~ vbird | 切换到vbird用户的主文件夹,即 /home/vbird |
cd ~ | 切换到当前用户的主文件夹 |
cd | 没有加上任何路径,也是代表回到自己主文件夹 |
cd .. | 去到上一层目录 |
pwd 显示目前所在目录
pwd | 显示当前路径 |
pwd [-p] | [-p]当目录或者文件是符号连接,则会显示实际的路径,不显示符号连接文件的路径 |
mkdir 新建目录
mkdir [-mp] 目录名称
mkdir 目录名称 | 只能创建单层目录 |
mkdir -m 目录名称 | 创建目录时,配置目录的权限,直接设置,不需要看默认权限(umask) mkdir -m 711 test |
mkdir -p 目录名称 | 多层目录创建 mkdir -p test1/test2/test3 |
rmdir 删除“空”的目录,被删除的目录里面必须不能存在其他的目录或文件
rmdir 目录 | 删除单个空目录 rmdir test1 |
rmdir -p 目录 | 删除多层级空目录 rmdir -p test1/test2/test3 |
执行文件路径的变量 $PATH
$PATH:执行文件路径的变量,是环境变量,使用echo $PATH,可以显示出哪些文件被定义成环境变量,这个变量内容由一堆目录组成,每个目录中间用冒号(:)来隔开。
在PATH目录中指定的执行文件路径的,可以直接使用执行文件命令,因为它是环境变量也就是全局变量,如果未指定,则使用“绝对路径”来执行该命令。在PATH中加入可执行文件目录:PATH="$PATH": 目录,如果我有两个ls命令在不同的目录中,例如/usr/local/bin/ls 与/bin/ls,那么当我执行ls的时候,哪个ls会被执行?PATH里面哪个目录先被查询,那么目录下的命令就会被先执行。
总结:1、不同身份用户默认的PATH不同,默认能够随意执行的命令也不同
2、PATH是可以修改的,所以一般用户还是可以通过修改PATH来执行某些位于/sbin或/usr/sbin下的命令来查询
3、使用绝对路径或相对路径直接指定某个命令的文件名来执行,会比查询PATH来的正确
4、命令应该要放置到正确的目录下,执行才会比较方便
5、本目录(.)最好不要放到PATH当中
ls 查看文件与目录
ls [-aAdfFhilnrRst] 目录名称
ls [--color={never,auto,always}] 目录名称
ls [--full-time] 目录名称
-a | 全部的文件,连同隐藏文件(开头为.的文件)一起列出来(常用) |
-d | 仅列出目录本身,而不是列出目录内的文件数据(常用) |
-F | 根据文件、目录等信息给予附加数据结构。*:可执行文件,/:目录 |
-l | 列出详细信息,包括文件的属性与权限等数据(常用) |
-i | 列出inode号码 |
-R | 连同子目录内容一起列出来,等于该目录下的所有文件都会显示出来 |
--full-time | 以完整时间模式输出 |
--time={atime,ctime} | 输出访问时间或改变权限属性时间 |
cp 复制文件或目录
cp [-adfilprsu] 源文件 目标文件
-a | 相当于-pdr ,备份(常用) |
-d | 若源文件为连接文件,则目标文件复制连接文件属性而非实际文件本身属性 |
-i | 若目标文件已经存在时,在覆盖时会先询问操作的进行(常用) |
-p | 连同文件的属性一起复制过去,而非使用默认属性(备份常用) |
-r | 递归持续复制,用于目录的复制行为(常用) |
-s | 复制成为符号连接文件,即快捷方式文件 |
-l | 复制成为硬连接文件 |
rm 移除文件或目录
rm [-fir] 文件或目录
-f | 忽略不存在的文件,不会出现警告信息 |
-i | 互动模式,再删除前会询问用户是否操作 |
-r | 递归删除。最常用在目录的删除 使用rm -r命令,请千万注意,会导致整个目录被删除 |
mv 移动文件或目录
mv [-fiu] 源文件 目标文件
-f | 如果目标文件已经存在,不会询问直接覆盖 |
-i | 如果目标文件已经存在,询问是否覆盖 |
-u | 如果目标文件已经存在,且源文件比较新,才会更新 |
cat 显示文件内容
cat [-AbEnTv] 文件名 由第一行开始显示
-n | 打印出行号,连同空白行也有行号 |
-b | 打印出行号,仅针对非空白行做行号显示 |
-A | 可列出一些特殊字符,而不是空白而已 |
tac:反向显示,由最后一行到第一行反向在屏幕上显示
more 文件名 一页一页翻动显示
在more运行过程,有几个按键是可以按的
空格键:向下翻一页,Enter:向下滚动一行, /字符串:代表向下查询‘字符串’这个关键字,q:离开more,不再显示该文件内容
less 文件名 一页一页翻动,不只可以向下翻,也可以向上翻页
空格键/[pagedown]:向下翻一页,[pageup]:向上反动一页 ,Enter:向下滚动一行, /字符串:代表向下查询‘字符串’这个关键字,?字符串:向上查询‘字符串’q:离开less,不再显示该文件内容
head 选取数据,取出前面几行
head [-n number] 文件 默认显示前10行
head -n 20 /etc/man.config 显示前20行
head -n -20 /etc/man.config 显示行数截止到倒数20行,即不显示后20行,其他行都显示
tail 选取数据,取出最后几行
tail [-n number] 文件名 默认10行
-n | 后面接数字,代表显示几行 |
-f | 表示持续监测后面所接的文件名,要等到按下【Ctrl】C才会结束tail检测 |
touch 修改文件时间或创建新文件
touch [-acdmt] 文件
-a | 修改访问时间 |
-c | 修改文件状态时间(像文件的属性与权限被更改了) |
-m | 修改文件的修改时间 |
-t | 接欲修改的时间而不是目前的时间,格式 为[YYMMDDhhmm] |
不接参数 | touch testtouch 新建文件 |
Umask 文件默认权限
新增一个文件或目录时默认的权限是什么,使用umask可以看到数字形态的权限设置分数,一种是加入-s这个参数,就会以符号类型方式来显示权限了。
在默认权限的属性上,目录与文件是不一样的,一般文件的创建不应该有执行的权限,因为一般文件通常是用于数据的记录。
umask的分数指的是“该默认值需要减掉的权限”。如果umask值为0022,新建文件时,文件的权限(-rw-rw-rw-)-(-----w--w-)=>-rw-r--r--。新建目录时,(drwxrwxrwx)-(d----w--w-)==>drwxr-xr-x
设置umask值:umask 022 查看umask值:umask
文件的隐藏属性(设置与显示)
chattr 设置文件的隐藏属性
chattr [+-=] [ASacdistu] 文件或目录名称
a | 当设置a之后,这个文件只能增加数据,而不能删除、修改数据,只有root才能有这个属性 |
i | 这个i可以让一个文件“不能删除、改名、设置连接,也无法写入或添加数据”。只有root能设置此属性 |
lsattr 显示文件隐藏属性
lsattr [-adR] 文件或目录
-a | 将隐藏文件属性也列出来 |
-d | 如果接的是目录,仅列出目录本身的属性而非目录内的文件名 |
-R | 连同子目录的数据也一并列出 |
文件特殊权限:SUID、SGID、SBIT
SUID:当s这个标志出现在文件所有者的x权限时,文件的权限状态“-rwsr-xr-x”,此时就被称为setUID,简称为SUID的特殊权限。
另外,SUID仅可用在二进制程序上,不能够用在shell script上面,当然SUID队友目录也是无效的,这点要特别留意。
SGID:当s标志在用户组的x时,则成为SetGID,SGID。
与SUID不同的时,SGID可以针对文件或目录来设置。如果对文件来说,SGID有如下功能:
当一个目录设置了SGID的权限后,它将具有如下的功能:
Sticky Bit:这个Sticky Bit(SBIT)目前只针对目录有效,对于文件已经没有效果了。
换句话说:当甲这个用户于A目录是具有用户组或其他人的身份,并且拥有该目录的w权限,这表示甲用户对该目录内任何人席间的目录或文件均可进行删除、重命名、移动等操作。不过,如果将A目录加上SBIT的权限时,则甲只能够针对自己创建的文件或目录进行删除、重命名、移动等操作,而无法删除他人的。
SUID:4 ,SGID:2,SBIT:1 -rwsr-xr-x 4755
查看文件类型:file
file 文件名
which 寻找执行文件(只在PATH变量中查找)
which [-a] command
-a | 将所有由PATH目录中可以找到的命令均列出,而不只是一个被找到的命令名称 |
文件名的查找
whereis 寻找特定文件
whereis [-bmsu] 文件或目录
-b | 只找二进制格式的文件 |
-m | 只找在说明文件manual路径下的文件 |
-s | 只找source源文件 |
-u | 查找不在上述三个选项当中的特殊文件 |
locate [-ir] keyword 找出关键字的文件名
-i | 忽略大小写差异 |
-r | 后面可接正则表达式的显示方式 |
find 查找文件
find [path] [option] [action]
option参数:
1、与时间有关的参数
-mtime n | n为数字,意义为在n天之前的“一天之内”被更改过的文件 find / -mtime 0 将过去24小时之内有修改的文件列出 |
-mtime +n | 列出在n天之前(不含n天本身)被更改过的文件名 |
-mtime -n | 列出在n天之内(含n天本身)被更改过的文件名 |
-newer file | file为一个存在的文件,列出比file还要新的文件名 |
2、与用户或用户组名有关的参数:
-uid n | n为用户的账号ID,这个UID是记录在/etc/passwd里面与账号名称对应的数字 |
-gid n | n为数字,这个数字是用户组名的ID,即GID,记录在/etc/group中 |
-user name | name为用户账号名称 |
-group name | name为用户组名 |
-nouser | 寻找文件的所有者不存在/etc/passwd的人 |
-nogroup | 寻找文件的所有用户组不存在于/etc/group中的文件 |
3、与文件权限及名称有关的参数:
-name filename | 查找文件名为filename的文件 |
-size [+-] SIZE | 查找比SIZE还要大或小的文件,这个SIZE的规格有:c:代表byte,k:代表1024bytes,例如 -size +50k |
-type TYPE | 查找文件的类型为TYPE的,类型主要有:一般正规文件(f)、设备文件(b、c)、目录(d)、连接文件(l)、socket(s)、及FIFO(p)等属性。 |
-perm mode | 查找文件权限“刚好等于”mode的文件,这个mode为类似chmod的属性值,例如mode为4755 |
-perm -mode | 查找文件权限“必须要全部包括mode的权限”,举例:查找-rwxr--r--,即0744的文件,使用 -perm -744,当一个文件权限为-rwsr-xr-x即4755时,也会被列出来 |
-perm +mode | 查找文件权限“包括任一mode的权限”的文件,举例,查找-rwxr-xr-x,即-perm +755时,但一个文件属性为-rw-------也会被列出来,因为它有-rw...的属性存在 |
df 列出文件系统的整体磁盘使用量
df [-ahikHTm] [目录或文件名]
-a | 列出所有的文件系统,包括系统特有的/proc等文件系统 |
-k | 以kb的容量显示各文件系统 |
-m | 以MB的容量显示各文件系统 |
-h | 以人们较易阅读的GB、MB、KB等格式自行显示(常用) |
-H | 以M=1000K替代M=1024K的进位方式 |
-T | 连同该分区的文件系统名称也列出 |
-i | 不用硬盘容量,而以inode的数量来显示 |
du 评估目录所占容量
du [-ahskm] 文件或目录名称
-a | 列出所有的文件与目录容量,因为默认仅统计目录下面的文件量而已 |
-h | 以人们较易读的容量显示 |
-s | 列出总量而已,而不列出每个各别的目录占用容量 |
-S | 不包括子目录下的总计,与-s有点差别 |
-k | 以KB列出容量 |
-m | 以MB列出容量 |
ln 连接文件
hard link(硬连接或实际连接):只是在某个目录下新建一条文件名连接到某inode号码的关联记录而已。也就是说多个文件,不同的文件名使用相同的inode码。举例:假设系统又个/root/crontab它是/etc/crontab的实际连接,也就是说这两个文件名连接到同一个inode,自然这两个文件名的所有相关信息都会一摸一样(除了文件名外)。
创建硬连接语法: ln 源文件 目标文件
好处:如果将任何一个“文件名”删除,其实inode 与block都还是存在的。你可以通过另一个“文件名”来读取到正确的文件数据。
hard link应该仅能在单一文件系统中进行的,应该是不能够跨文件系统才对。不能连接到目录的。
symbolic link(符号连接,快捷方式)
symbolic link:就是在创建一个独立的文件,而这个文件会让数据的读取指向它连接的那个文件的文件名。当源文件被删除之后,symbolic link的文件会"开不了"。两个文件指向不同的inode号码,当然就是两个独立的文件存在,而且连接文件的重要内容就是它会写上目标文件的”文件名“
ln -s 源文件 目标文件
文件的压缩与打包
gzip [-cdtv#] 文件名 压缩默认不保留源文件
-c | 将压缩的数据输出到屏幕上,可通过数据流重定向来处理 gzip -c man.config>man.config.gz 压缩文件并保留源文件 |
-d | 解压缩的参数 |
-t | 可以用来检验一个压缩文件的一致性,看看文件有无错误 |
-v | 可以显示出源文件/压缩文件的压缩比等信息 |
-# | 压缩等级,-1:最快,压缩比最差,-9最慢,压缩比最好默认是-6 |
gunzip [-c] 已压缩文件名 解压默认不保留原文件名
-c | 解压文件并保留压缩文件 gunzip -c man.config.gz>man.conf |
zcat 文件名 :将压缩文件的内容读出来
bzip2 [-cdkzv#] 文件名 默认压缩不保留文件
-c | 将压缩过程中产生的数据输出到屏幕上 bzip2 -c man.config>man.config.bz2 |
-d | 解压缩的参数 |
-k | 保留源文件,而不会删除原始的文件 |
-z | 压缩的参数 |
-v | 可以显示出原文件/压缩文件的压缩比等信息 |
-# | 与gzip一样 |
tar 打包文件
tar -jcvf filename.tar.bz2 要被压缩的文件或目录 tar -zcvf filename.tar.gz 要被压缩的文件或目录
tar -jxvf filename.tar.bz2 文件名 tar -zxvf filename.tar.gz 文件名
tar -jxvf filename.tar.bz2 -C 欲解压的目录 tar -zxvf filename.tar.gz -C 欲解压的目录
bash shell的内置命令:type
type:查看命令是来自于外部命令(指的是其他非bash所提供的命令)或是内置在bash当中。type主要是找出”执行文件“而不是一般文件名。
type [-tpa] name
type不加任何参数,type会显示出name是外部命令还是bash内置命令
-t | file:表示外部命令 alias:表示该命令为命令别名所设置的名称 builtin:表示该命令为bash内置的命令功能 |
-p | 如果后面接的name为外部命令时,才会显示完整文件名 |
-a | 会由PATH变量定义的路径中,将所有含name的命令都列出来,包含alias |
shell变量
变量的显示:echo echo $PATH 或 echo ${PATH}
变量的设置:用等号"="连接变量与它的内容就好了。myname=VBird。在bash当中,当一个变量名称尚未被设置时,默认的内容是“空”的。
变量的设置规则:
1、变量与变量内容以一个等号“=”来连接,如myname=VBird,等号两边不能直接接空格符。
2、变量名称只能是英文字母与数字,但是开头字符不能是数字
3、变量内容若有空格符可使用双引号“”或单引号‘’将变量内容结合起来,但是双引号内的特殊字符如$等,可以保有原本的特性,如下所示:若var="lang is $LANG",则echo $var可得 lang is en_US。单引号内的特殊字符则仅为一般字符(纯文本),如下所示var='lang is $LANG',则echo $var可得lang is $LANG。
4、可用转义字符"\"将特殊符号(如[enter]、$、\、空格符、!等)变成一般字符
5、在一串命令中,还需要通过其他的命令提供的信息,可以使用返单引号“`命令`”或$(命令)。version=$(uname -r)
6、若该变量为了增加变量内容时,则可用“$变量名称”或${变量名称}累加内容:PATH=${PATH}:/home/bin
7、若该变量需要在其他子进程执行,则需要以export来使变量变成环境变量 。 export PATH
8、通常大写字符为系统默认变量,自行设置变量可以使用小写字符,方便判断
9、取消变量的方法为使用unset 变量,例如 unset myname
在命令执行的过程中,反单引号``这个符号代表的意义如何?
在一串命令中,在`之内的命令会被先执行,而其执行出来的结果将作为外部的输入信息。
env 查看环境变量(export一样)
env:查看目前shell环境下的所有环境变量与其内容
set 查看所有变量
set: 查看所有变量,包括环境变量和自定义变量
其中变量$,代表的是目前这个shell的线程代号,即所谓的PID;使用 echo $$
变量?代表上一个命令执行后的回传码,0 表示执行成功,使用 echo $?
shell 变量的有效范围(环境变量与自定义变量有什么不同?)
环境变量可以被子进程所引用,但其他的自定义变量内容就不会存在于子进程中。可以通过export将自定义变量转成环境变量。 export 变量名
read 读取来自键盘的变量
read [-pt] variable
-p | 后面可以接提示符 read -p '提示语' variable |
-t | 后面可以接等待的秒数,不会一直等待用户 |
declare 声明变量的类型
如果使用declare后面没有接任何参数,那么bash就会主动将所有的变量名称与内容全部调出来,就好像使用set一样。
declare [-aixr] variable
-a | 将后面名为variable的变量定义为数组(array)类型 |
-i | 将后面名为variable的变量定义为整数数字(integer)类型 |
-x | 用法与export一样,将自定义变量转成环境变量 |
+x | 将环境变量转成自定义变量 |
-r | 将变量设置称为readonly类型,该变量不可被更改内容,也不能重设 |
-p | 可以单独列出变量的类型 |
* 变量类型默认为字符串,所以若不指定变量类型,则1+2为一个字符串而不是计算式,所以定义sum=100+300+50, echo $sum得到的是100+300+50.而declare -i sum=100+300+50,echo $sum得到的结果是450。bash环境中的数值运算,默认最多仅能到达整数类型,所以1/3结果是0。
数组变量类型
数组设置:var[index]=content,意思是有一个数组名为var,而这个数组的内容为var[1]="small min",var[2]="big min"等等,那个index就是一些数字,重点是用中括号来设置的。读取数组的方式是${数组},即echo "${var[1]},${var[2]}"
变量内容的删除、替代与替换
path=${PATH}
1、从左边开始删除部分字符串:${变量#关键字} 或 ${变量##关键字}
其中variable是原本变量名称,#代表从变量内容的最前面开始向右删除,且仅删除最短的那个,/*kerberos/bin:代表要被删除的部分,由/开始,*代表通配符,替代0到无穷多个任意字符
#:符合替换文字的最短的那一个 ${variable#/*kerberos/bin:}
##:符合替换文字的最长的那一个 ${variable##/*kerberos/bin:}
2、从后面向前删除变量内容: ${变量%关键字} 或 ${变量%%关键字}
其中variable是原本变量名称,%代表从变量内容从后面向前删除,且仅删除最短的那个,:*bin代表要被删除的部分,由:开始,*代表通配符
%:符合替换文字最短的一个 ${variable%:*bin}
%%:符合替换文字最长的一个 ${variable%%:*bin}
3、替换变量内容
${variable/旧字符串/新字符串} 若变量内容符合旧字符串,则第一个旧字符串会被新字符串被新字符串替换
${variable//旧字符串/新字符串} 若变量内容符合旧字符串,则全部的旧字符串会被新字符串被新字符串替换
变量别名设置: alias 和unalias
设置别名 : alias 别名=命令参数 eg:alias rm='rm -i'
查看别名: alias
取消别名: unalias 别名
历史命令
history [n] 列出最近的n条命令行
history -c 将目前的shell中的所有history的内容清除。
执行历史命令:
!number 执行第几条命令
!command 由最近的命令向前搜寻命令串开头为command的那个命令,并执行
!! 执行上一个命令(相当于按pgup按钮后,按【enter】)
shell中路径与命令查找顺序
当系统中有多个相同命令时,执行的是哪个路径的命令呢?shell 有一个命令执行规则,按照以下的优先顺序执行:
bash 通配符
* | 代表0个到无穷多个任意字符 |
? | 代表一定有一个任意字符 |
[] | 一定有一个在中括号内的字符(非任意字符)。例如[abcd]代表一定有一个字符,可能是a,b,c,d这四个任何一个 |
[-] | 若有减号在中括号时,代表在编码顺序内的所有字符一定有一个,例如[0-9]代表0到9之间的所有数字都可能 |
[^] | 若中括号内的第一个字符为指数符号^,那表示反向选择,例如[^abc],代表一定有一个字符,只要是非a,b,c的其他字符就接受的意思 |
数据流重定向
数据流重定向就是将某个命令执行后应该要出现在屏幕上的数据传输到其他地方,例如文件或者是设备。
1、标准输入(stdin):代码为0,使用<或<<
2、标准输出(stdout):代码为1,使用>或>>
3、标准错误输出(stderr):代码为2,使用2>或2>>
eg1: ll / > ~/rootfile 标准输出
1、该文件(~/rootfile)若不存在,系统会自动将它创建起来
2、若以>输出到一个已经存在的文件中,那个文件会被覆盖
3、要是不想覆盖文件,而只向累加数据,则使用>>
eg2: find /home -name .bashrc > list_right 2>list_error
将正确的输出到list_right文件,将错误输出输出到list_error文件中
eg3: find /home -name .bashrc 2>/dev/null
/dev/null黑洞设备,可以吃掉任何导向这个设备的信息,如上,只有stdout会显示到屏幕上,stderr被丢弃了。
eg4 find /home -name .bashrc >list 2>&1 或 find /home -name .bashrc &>list
将正确与错误数据通通写入同一个文件去。
标准输入
<:将原文需要由键盘输入的数据改由文件内容来替代
eg cat > catfile < ~/.bashrc
用stdin替代键盘的输入以创建文件
<<:代表结束输入的意思
eg cat >catfile <<"eof"
> This is a test
>Ok now stop
> eof =>输入这关键字,立刻就结束而不需要输入【CTRL】+D
一次执行多个命令
; | 不考虑命令相关性的连续命令执行 eg : sync;sync; shutdown -h now |
&& | 在前一个命令执行完毕且正确的情况下,执行下一个命令 cmd1 && cmd2 若cmd1执行完毕且正确执行($?=0),则开始执行cmd2 若cmd1执行完毕且为错误($?不等于0),则cmd2不执行 |
|| | 在前一个命令执行完毕且错误的情况下,执行下一个命令 cmd1||cmd2 若cmd1执行完毕且正确执行($?=0),则不执行cmd2 若cmd1执行完毕且为错误($?不等于0),则开始执行cmd2 |
eg: 以ls测试/tmp/vbnew是否存在,若存在则显示exist,若不存在则显示not exist
ls /tmp/vbnew && echo 'exist' || echo 'not exist' (顺序不能错)
管道命令
管道命令"|"仅能处理经由前面一个命令传来的正确信息,也就是standard output的信息,对于standard error并没有直接处理的能力。在每个管道后面接的第一个数据必定是"命令",而且这个命令必须要能够接收standard input的数据才行,这样的命令才可以是管道命令,例如less,more,head,tail等都是可以接收standard input的管道命令。
选取命令:cut、grep 以行为单位处理数据
cut:可以将一段信息的某一段“切”出来,处理的信息是以行为单位
cut -d '分割字符' -f fields 根据分割符将行分割成多段,取出第几段,field表示第几段
cut -c 字符范围 依据字符范围取出数据, cut -c 5-20 取出12-20个字符
eg : echo $PATH | cut -d ':' -f 5
grep:可以解析一行文字,取得关键字,若该行有存在关键字,就会整行列出来
grep [-acinv] [--color=auto] '查找字符串' filename
-a | 将binary文件以text文件分方式查找数据 |
-c | 计算找到‘查找字符串’的次数 |
-i | 忽略大小写 |
-n | 顺便输出行号 |
-v | 反向选择,即显示没有‘查找字符串’内容的那一行 |
--color=auto | 将找到的关键字部分加上颜色显示 |
sort 可以依据不同的数据类型来排序
sort [-fbMnrtuk] [file or stdin]
-f | 忽略大小写差异 |
-b | 忽略最前面的空格符部分 |
-M | 以月份的名字来排序 |
-n | 以纯数字进行排序(默认是以文字类型来排序的) |
-r | 反向排序 |
-u | 就是uniq,相同的数据,仅出现一行 |
-t | 分隔符,默认是用【tab】键来分割 |
-k | 以那个区间(field)来进行排序 cat /etc/passwd | sort -t ':' -k 3 以第三列来排序 |
uniq 将重复的行删除掉只显示一个 (一般跟sort配合使用,如果不进行排序就执行uniq会得不到想要的结果)
uniq [-ic]
-i | 忽略大小写字符的不同 last | cut -d ' ' f 1 | sort | uniq |
-c | 去重后并进行计数 last | cut -d ' ' f 1 | sort | uniq -c
|
wc 计算文件里面有多少行,多少字,多少字符
wc [-lwm]
eg: cat /etc/man.config | wc 输出行、字、字符数
-l | 仅列出行 |
-w | 仅列出字(英文单字) |
-m | 多少字符 |
tee 双向重定向
tee 会同时将数据流送与文件与屏幕(screen),而输出到屏幕的,其实就是stdout,可以让下个命令继续处理。
tee [-a] file
eg: last | tee last.list | cut -d ' ' -f 1
-a | 以累加(append)的方式,将数据加入file当中 |
split 切割命令 (将一个大文件依据文件大小或行数来切割成为小文件)
split [-bl] file PREFIX
PREFIX:代表前导符,可作为切割文件的前导文字
-b | 后面接欲切割的文件大小,可加单位,例如b,k,m等 split -b 300k /etc/termcap termcap |
-l | 以行数来进行切割 |
eg: cat termcap* >> termcapback 将上面的三个文件合成一个文件,文件名为tercapback。
eg:使用ls -al /输出的信息中,每10行记录成一个文件
ls -al / | split -l 10 - lsroot
*重点在那个-。一般来说,如果需要stdout/stdin,但偏偏又没有文件,有的只是-时,那么那个-就会被当成stdin或stdout
* 如果file部分写成 减号(-),表示来自standard input的数据的意思(stdin)
正则表达式
正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易达到查找、删除、替换某特定字符的处理程序。正则表达式基本上是一种“表示法”,只要工具程序支持这种表示法,那么该工具程序就可以用来作为正则表达式的字符串处理之用。
例如vi、grep、awk、sed等工具,它们支持正则表达式,所以这些工具就可以使用正则表达式的特殊字符来进行字符串处理,但例如cp、ls等命令并未支持正则表达式,所以就只能使用bash自身通配符而已。正则表达式的字符串表示方式依照不同的严谨度而分为基础正则表达式与扩展正则表达式。
基础正则表达式字符归纳:
. | 代表一定有一个任意字符 |
* | 重复零个到无穷多个的前一个字符 |
^ | 待查找的字符串在行首 |
$ | 待查找的字符串在行尾 |
[] | 从字符集合里面找出想要匹配的一个字符 |
[-] | [-]表示连续的字符,从连续字符集合中找出想要匹配的一个字符 |
[^] | 从字符集合里面匹配非这个字符集合的字符 |
\{m,n\} | 重复前一个字符m到n次,若为\{m,\} 则是重复m个以上的前一个字符 |
\ | 转义字符,将特殊符号的特殊意义去掉 |
grep的一些高级参数和正则匹配
grep [-A] [-B] [--color=auto] '搜索字符串' filename
-A | 后面可加数字,为after的意思,除了列出该行外,后续的n行也列出来 |
-B | 后面可加数字,为before的意思,出了列出该行外,前面的n行也列出来 |
--color=auto | 可将正确的那个选取数据列出颜色 |
1、查找特定字符串
eg1: dmesg | grep -n --color=auto 'eth' 用dmesg列出内核信息,再以grep找出含‘eth’那行,并显示行号及特殊颜色显示
eg2: dmesg | grep -n -A 3 -B 2 --color=auto 'eth' 承上,在关键字所在行的前2行后3行也一起找出来显示
* grep在数据中查找一个字符串时,是以整行为单位来进行数据的选取的,也就是说,假如一个文件内有10行,其中有两行具有你所查找的字符串,则将那两行显示在屏幕上,其他就丢弃了。
2、利用中括号[]来查找集合字符
其中[]里面不论有几个字符,它都只代表某“一个”字符
eg1: grep -n 't[ae]st' regular.txt 查找tast或test
eg2: grep -n '[^g]oo' regular.txt 查找oo前面不是g的行
eg3: grep -n '[^a-z]oo' regular.txt 查找oo前面不想有小写字符行
eg4: grep -n '[0-9]' regular.txt 取得有数字的一行
3、行首与行尾字符^$
eg1: grep -n '^the' regular.txt 找出以the开头的行
eg2: grep -n '^[a-zA-Z]' regular.txt 以英文字母开头的行
*那个^符号在字符集合符号(中括号[])之内与之外是不同的,在[]内代表反向选择,在[]之外则代表定位在行首的意义,要分清楚
eg3: grep -n '\.$' regular.txt 找出以.结尾的行
eg4: grep -n '^$' regular.txt 找出空白行
eg5: grep -v '^$' /etc/syslog.conf | grep -v '^#' 找出去除空行和#注释行
4、任意一个字符.与重复字符*
eg1 grep -n 'g..d' regular.txt 找出g??d字符串
eg2: grep -n 'ooo*' regular.txt 找出至少两个o以上的字符串
eg3: grep -n 'goo*g' regular.txt 找出字符串开头结尾都是g,两个g之间仅能存在至少一个o,即gog,goog,gooog等
5、限定连续RE字符范围{}
限制一个范围区间内的重复字符数,使用限定范围字符{}.但因为{与}的符号在shell是有特殊意义的,因此,必须要使用转义字符\来让它失去特殊意义才行。
eg1: grep -n 'o\{2\}' regular.txt 找到2个o的字符串
eg2: grep -n 'go\{2,5\}g' regular.txt 找到g后面接2到5个o,然后再接g的字符串
eg3: grep -n 'go\{2,\}g' regular.txt 两个以上的o
sed工具
sed本身也是一个管道命令,可以分析standard input 的,而且sed还可以将数据进行替换、删除、新增、选取特定行等的功能。
sed [-nefr] [动作]
-n | 使用安静模式,在一般sed用法中,所有来自stdin的数据一般都会被列出屏幕,但如果加上-n参数后,则只有经过sed特殊处理的哪一行才会被列出来 |
-e | 直接在命令行模式上进行sed的动作编辑 |
-f | 直接将sed的动作写在一个文件内,-f filename可以执行filename内的sed动作 |
-r | sed的动作支持的是扩展正则表达式语法(默认是基础正则表达式语法) |
-i | 直接修改读取的文件内容,而不由屏幕输出 |
动作说明: [n1 [, n2]] function
n1,n2:不见得会存在,一般代表选择进行动作的行数,具体来说,如果我的动作是需要在10-20行之间进行的,则"10,20[动作]"
function有以下参数:
a | 新增,a的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行) |
c | 替换,c的后面可以接字符串,这些字符串可以替换n1,n2之间的行 |
d | 删除,因为是删除,所以d后面通常不接任何参数 |
i | 插入,i的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行) |
p | 打印,就是讲某些行的数据打印出来,通常p会与参数sed -n 一起使用 |
s | 替换,可以直接进行替换的工作,而不是将n1,n2之间的行替换,通常s的动作可以搭配正则表达式 |
1、以行为单位的新增/删除功能
原本在命令行中应该要执行sed -e才对,没有-e也行,同时sed后面接的动作,请务必以''两个单引号引住
eg1: nl /etc/passwd | sed '2,5d' 将/etc/passwd的内容列出并且打印行号,同时,请将2-5行删除
eg2: nl /etc/passwd | sed '3,$d' 将/etc/passwd的内容列出并且打印行号,同时,删除第三行到最后一行
eg3: nl /etc/passwd | sed '2a Drink tea or ...\
drink bear?'
在第二行后面加上两行字,但是每一行之间都必须要以反斜杠“\”来进行新行增加
2、以行为单位的替换与现实功能
eg1: nl /etc/passwd | sed '2,5c NO 2-5 number' 将第2-5行的内容替换成为“NO 2-5 number”
eg2: nl /etc/passwd | sed -n '5,7p' 仅列出/etc/passwd文件的第5-7行
=head -n 20 | tail -n 10
3、部分数据的查找并替换的功能
sed 's/要被替换的字符串/新的字符串/g'
eg1: /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'
查看源信息,利用/sbin/ifconfig查询IP,利用关键字配合grep选取出关键的一行数据,将IP前面的部分予以删除
eg2: /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
承上例,将IP后面的部分予以删除
eg3: cat /etc/man.config | grep 'MAN' | sed 's/#.*$//g' 先使用grep将关键字MAN所在行取出来,删除掉批注之后的数据
eg4: cat /etc/man.config | grep 'MAN' | sed 's/#.*$//g' | sed '/^$/d'
承上例,原本批注数据编程空白行,所以,接下来要删除掉空白行
4、直接修改文件内容(危险操作)
eg1: sed -i 's/\./\!/g' regular.txt 利用sed将regular.txt内每一行结尾为“.”换成“!”
eg2: sed -i '$a # this is a test ' regular.txt 利用sed直接在regular.txt最后一行加入“#this is a test”
eg3: cat /etc/passwd | sed -e '4d' -e '6c no six line' > passwd.new
sed 后面如果要接超过两个以上的动作时,每个动作前面得加 -e 才行
扩展正则表达式
grep 默认仅支持基础正则表达式,如果要使用扩展正则表达式,可以使用grep -E,不过更建议使用egrep。
扩展正则表达式符号
+ | 重复一个或一个以上的前一个RE字符 egrep -n 'go+d' regular.txt |
? | 重复零个或一个的前一个字符 egrep -n 'go?d' regular.txt |
| | 用或(or)的方式找出数个字符串 egrep -n 'go| good ' regular.txt |
( ) | 找出“组”字符串 egrep -n 'g(la | oo )d' regular.txt |
( )+ | 多个重复组的判别 egrep -n 'g(la| oo)+ d' regular.txt |
awk:好用的数据处理工具
awk也是一个非常棒的数据处理工具。相比于sed常常用于一整行的处理,awk则比较倾向于将一行分成数个“字段”来处理。awk主要是处理每一行的字段内的数据,而默认的字段的分隔符为空格键或【tab】键。
awk ‘条件类型1{动作1}条件类型2{动作2}...’ filename
eg1. last -n 5 | awk '{print $1 "\t" $3}'
在每一行的每个字段都是有变量名称的,那就是$1,$2等变量名称。$0代表一整行数据的意思。
awk的处理流程是:
1、读入第一行,并将第一行的数据填入$0,$1,$2等变量当中;
2、依据条件类型的限制,判断是否需要进行后面的动作;
3、做完所有的动作与条件类型;
4、若还有后续的“行”的数据,则重复上面1-3的步骤,知道所有的数据都读完为止。
awk是以行为一次处理的单位,而以字段为最小的处理单位。
awk的内置变量:
NF | 每一行($0)拥有的字段总数 |
NR | 目前awk所处理的是“第几行”数据 |
FS | 目前的分割字符,默认是空格键 |
注意:在awk内的NR,NF等变量要用大小且不需要$。
awk 的逻辑运算符:
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
eg1: cat /etc/passwd | awk '{FS=":"}$3<10{print $1 "\t" $3}'
以冒号":"分割的/etc/passwd,查找该文件中第一字段,第三字段,且第三列小于10以下的数据,并且仅列出账号与第三列。
*虽然定义了FS=":",但是却仅能在第二行后才开始生效。需要利用BEGIN关键字才能在读入第一行时开始生效
eg2 : cat /etc/passwd | awk 'BEGIN{FS=":"}$3<10{print $1 "\t" $3}'
*所有awk的动作,即在{}内的动作,如果有需要多个命令辅助时,可利用分号";"间隔,或者直接以【Enter】案件来隔开每个命令。
逻辑运算中,如果是“等于”的情况,则五笔使用两个“==”。在格式化输出时,在printf的格式设置当中,务必加上\n,才能进行分行。与bash shell的变量不同,在awk当中,变量可以直接使用,不需加上$符号。
文件比较工具
diff: diff时用在比较两个文件之间的区别的,并且是以行为单位来比较的,一般时在ASCII纯文本文件的比较上。由于时以行为比较单位,因此diff通常是用在同一个文件的新旧版本区别上。
diff [-bBi] from-file to-file
from-file : 一个文件名,作为欲比较文件的文件名
to-file: 一个文件名,作为目的比较文件的文件名
注:from-file或to-file可以用“-”替换,那个-代表standard input之意
-b | 忽略一行当中仅有多个空白的区别 |
-B | 忽略空白行的区别 |
-i | 忽略大小写的不同 |
cmp:主要也是比较两个文件,它主要利用"字节"单位去比较,因此,当然也可以比较二进制文件。
cmp [-s] file1 file2
-s | 将所有的不同点的字节处都列出来,因为cmp默认仅会输出第一个发现的不同点 |
进程
进程:当触发任何一个事件时,系统都会将它定义成为一个进程,并且给予这个进程一个ID,称为PID,同时依据触发这个进程的用户与相关属性关系,给予这个PID一组有效的权限设置。
程序与进程总结:
程序:通常为二进制程序放置在存储媒介中,以物理文件的形式存在。
进程:程序被触发后,执行者的权限与属性、程序的程序代码与所需数据等都会被加载到内存中,操作系统并给予这个内存内的单元一个标识符(PID),可以说,进程就是一个正在运行中的程序。
bash下的工作管理
当登录bash之后,就是取得一个名为bash的PID了,而在这个环境下面执行的其他命令,就几乎都是所谓的子进程。
工作管理(job control):当我们登录系统取得bash shell之后,在单一终端机下同时进行多个工作的行为管理。
由于假设我们只有一个终端,因此在可以出现提示符让你操作的环境就称为前台(foreground),至于其他工作就可以让你放入后台(background)去暂停或运行。要注意的是,放入后台的工作想要运行时,它必须不能够与用户互动。举例来说,vim绝对不可能在后台里面执行。因为你没有输入数据它就不会跑。而且放入后台的工作是不可以使用【ctrl】+c来终止的。
job control的管理
bash只能够管理自己的工作而不能管理其他bash的工作,所以即使你是root也不能够将别人的bash下面的job给他拿过来执行。
1、直接将命令丢到后台中“执行”的&
2、将目前工作丢到后台中“暂停”:【ctrl】+Z
3、查看目前的后台工作状态:jobs
jobs [-lrs]
-l | 除了列出job number与命令之外,同时列出PID的号码 |
-r | 仅列出正在后台run的工作 |
-s | 仅列出正在后台当中暂停(stop)的工作 |
4、将后台工作拿到前台来处理:fg
fg %job number
%job number:jobnumber为工作号码(数字)。注意,那个%是可有可无的。
5、让工作在后台下的状态变成运行中:bg
bg %jobnumber
6、管理后台当中的工作:kill
kill -signal %jobnumber
kill -l
-l | 这是列出目前kill能够使用的信号有哪些 |
signal | 代表给予后面接的那个工作什么样的指示。用man 7 signal 可知: -1:重新读取一次参数的配置文件(类似reload) -2:代表与由键盘输入【ctrl】-C同样的操作 -9:立刻强制删除一个工作 -15:以正常的程序方式终止一项工作,与-9是不一样的。 |
另外:kill后面接的数字默认会是PID,如果想要管理bash的工作控制,就得加上%数字了。
脱机管理:
nohup [命令与参数] 在终端机前台工作
nohup [命令与参数] & 在终端机后台工作
进程的查看 ps
ps : 将某个时间点的进程运行情况选取下来
ps -aux 查看系统所有的进程数据
ps -lA 查看所有系统的数据
ps axjf 连同部分进程树状态
-A | 所有进程均显示出来,与-e具有同样的作用 |
-a | 不与terminal有关的所有进程 |
-u | 有效用户相关的进程 |
-x | 通常与a参数一起用,可列出较完整信息 |
仅查看自己的bash相关进程: ps -l
查看系统所有的进程: ps -aux
动态查看进程的变化:top
ps是选取一个时间点的进程状态,top则可以持续检测进程运行的状态
top [-d 数字] | top [-bnp]
-d | 后面可以接秒数,就是整个进程界面更新的秒数,默认是5秒 |
-b | 以批次的方式执行top,还有更多参数可用 |
-n | 与-b搭配 |
-p | 指定某些个PID来进行查看检测而已 |
eg1: top -b -n 2 > /tmp/top.txt
将top信息进行2次,然后将结果输出到/tmp/top.txt
echo $$ bash PID 可由$$变量取得
top -d 2 -p 13639 使用top持续查看该PID
free:查看内存使用情况
free [-b|-k|-m|-g] [-t]
-b:直接输入free时,显示的单位是KB,我们可以使用b(bytes),m(MB),k(KB),以及g(GB)来显示单位。
-t:在输出的最终结果中显示为物理内存与swap总量
uname 查看系统与内核相关信息
uname [-asrmpi]
-a | 所有系统相关信息,包括下面数据都会列出来 |
-s | 系统内核名称 |
-r | 内核版本 |
-m | 本系统硬件名称,例i686或x86-64 |
-p | cpu的类型,与-m类似 |
-i | 硬件平台 |