1 打开终端后,就会出现一个提示符,形式通常如下
username@hostname$ 或者root@hostname#
2 $表示的是普通用户,#表示的是超级用户。超级用户是Linux中权限最高的用户
3 有两种运行脚本的方式
sh script.sh 或者是 path script (path是脚本所在的目录)
4 在bash中每个命令是通过分号";"来分开的
1.2 终端打印
1 echo是用于终端打印的基本命令,在默认情况下echo在每次调用后都会添加一个换行符
2 另一个可以用来终端打印的命令是printf,printf的参数和C语言中的printf函数一样
3 在默认情况下,echo会将一个换行符追加到输出文本的尾部,可以使用-n来忽略结尾的换行符
4 如果需要使用转义序列,则采用echo -e ”包含转义序列的字符串"这种形式
1.3 玩转变量和环境变量
1 我们可以使用pgrep来快速找到一个进程的pid,假如有一个gedti正在运行,那么我们通过pgrep gedit就可以快速知道这个gedit的进程id
2 一个变量可以通过以下方式来进行赋值 var=value,var是变量名,value是变量值,如果value不包含任何空白字符,那么他不需要使用引号来进行引用,否则就需要使用引号进行引用
3 环境是未在当前进程中定义,而从父进程中继承来的变量
4 export命令用来设置环境变量
5 获得字符串的长度 length=${#var},可以用来求变量var的长度
1.4 通过shell进行数学运算
1 在bash环境中,我们可以使用let (()) 和[]来进行基本的算数操作,在进行高级的运算中,可以使用expr和bc
2 当使用let的时候,变量名之前是不需要再添加$,例如let res=num1+num2
3 let支持++和--等各种操作
4 操作符[]的使用方法和let命令类似,例如res=$[ num1 + num2 ]
5 也可以使用(()),但是使用(())时,变量名之前要加上$,例如res=$(( num1 + num2 ))
6 我们可以使用scale=2来将小数点位数设置为2
1.5 玩转文件描述符和重定向
1 文件描述符是于文件输入,输出相关联的整数,他们用来跟踪与打开的文件,最常见的文件描述符是stdin,stdout,stderr。
2 文件描述符是与一个打开的文件或数据流相关联的整数,文件描述符0,1和2是系统预留的
0 - stdin标准输入,1 - stdout标准输出,2 - stderr标准错误
3 用下面的方法可以把输出文本重定向到一个文件中
echo "this ...." > out , 这样便可以把输出的字符串重定向到out文件中
4 >和>>并不相同,前者是会先清空文件再写入内容,而后者是会将内容追加到现有的文件的尾部
5 当使用重定向操作符的时候,重定向的内容不会出现在终端,而是直接被导入文件。重定向操作默认使用标准输出
6 >等同于1>;对于>>来说,等同于1>>
7 借助重定向,我们可以使用stdin那样从文件中读取数据 cmd < file
8 我们可以使用exec命令创建自定义的文件描述符
1.6 数组和关联数组
1 bash同时支持数组和关联数组,普通数组只能使用整数做为数组索引,而关联数组可以使用字符串做为数组索引
2 定义数组的方法有很多种
第一种:array_var=(1 2 3 4 5),这些值会存储在以0为起始索引的连续位置上
第二种:array_var[0]=1
array_var[1]=2
......................
3 打印特定元素的数组内容,${array_var[index]},将会打印处索引为index的内容
4 以清单形式打印处数组中的所有值,${array_var[*]}
5 打印数组的长度${#array_var[*]}
6 在关联数组中,我们可以使用任意的文本做为数组索引,在普通数组中,只能用整数做为索引
7 首先我们需要单独的声明语句将一个变量名声明为关联数组declare -A ass_array
1.7 使用别名
1 别名有多种实现方式,可以使用函数,也可以使用alias命令
2 可以按照以下方式来创建一个别名 alias new_command='command'
3 alias命令的作用只是暂时的,我们要写在~/.bashrc中,然后用source ~/.bashrc这样就可以长久的使用别名
4 如果要删除别名,我们可以使用unalias或者直接删除~/.bashrc
1.8 获取终端信息
1 获取终端的行数和列数 tput cols 和 tput lines
2 打印当前的终端名 tput longname
3 删除当前光标位置到行尾的所有内容 tput ed
1.9 获取/设置日期和延时
1 我们使用date来打印处日期
2 打印纪远时 date +%s,纪远时被定义为从世界标准时间1970年1月1号0时0分0秒至当前时刻的总秒数
3 用格式串结合+作为date命令的参数,可以按照你的选择打印出对应的格式和日期
4 我们可以使用sleep time来延时time秒
5 tput sc是用来存储光标位置,tput rc是恢复光标位置,tput ed是清除从当前光标位置到行末的内容
1.10
1 使用-x,启动跟踪调试shell脚本,运行带有-x标志的脚本能够打出所执行的每一行命令及当前状态
2 针对每一种情况,我们可以在脚本中设置启用或是禁止调试打印
set -x 在执行时显示参数和命令
set +x 禁止调试
set -v 当命令进行读取时显示输入
set +v 禁止打印输入
3 我们可以直接使用shebang #!/bin/bash改成#!/bin/bash -xv不用其它显项直接进行调试
1.11
1 函数定义
function fname(){
statements
}
或者是
fname(){
statements
}
2 只要使用函数名就可以调用某个函数 fname,就会执行fname函数
3 参数可以传递给函数 fname arg1 arg2
4 类似地,参数可以传递给脚本并通过script来访问
$1 是第一个参数
$2 是第二个参数
$n 是第n个参数
$@ 被扩展成"$1" “$2" "$3"
$* 被扩展成"$1c$2c$3",其中c是IFS的第一个字符
$@ 用的比较多,由于$*把所有的参数都当作单个字符串,因此很少被利用
5 在bash中每一条命令执行之后都会返回一个值,如果是0表示执行成功,其它表示执行失败
1.12
1 我们使用管道pipe来连接每一个过滤器,例如$cmd1 | cmd2 | cmd3,这里组合了三个命令,cmd1输出传递给cmd2,而cmd2传递给cmd3,最终输出将会被打印或导入某个文件
2 我们有两种方法取得命令序列的输出
第一种:output=$(cmd),这样就会把cmd命令的结果输出到output上
第二种:output=`cmd`,这样就会把cmd命令的结果输出到output上
3 假设我们使用子shll或反引用的方法将命令的输出读入一个变量中,可以将它放入双引号中,以保留空格和换行符
1.13 字段分割符和迭代器
1 内部字段分割符IFS是shell脚本中一个重要的概念,默认的IFS是空白字符(换行符,制表符或者空格)
2 我们可以轻松的生成不同序列
echo {1..50} 这样能够生成一个从1到50的序列
echo {a..z} 这样能够生成a到z的序列
3 for循环
for i in list
do
statements
done
4 while循环
while condition
do
statements
done
1.14 比较和测试
1 if条件
if condition
then
statements
elif condition
statements
else
statements
fi
2 我们可以使用逻辑运算符来减少if else的使用
[ condition ] && action 如果condition条件为真,那么执行action
[ condition ] || action 如果condition条件为假,那么执行action
3 算术比较
-eq: 相等
-ne: 不相等
-gt: 大于
-lt: 小于
-ge: 大于等于
-le: 小于或等于
4 文件系统相关测试
[ -f $file ] 如果给定的文件是普通文件则返回真
[ -x $file ] 如果给点的文件具有执行权限则返回真
[ -d $file ] 如果给点的文件是目录则返回真
[ -e $file ] 如果文件file存在则返回真
[ -c $file ] 如果给定的文件是字符设备文件则返回真
[ -b $file ] 如果给点的文件是块设备文件则返回真
[ -w $file ] 如果给点的文件具有可些权限则返回真
[ -r $file ] 如果文件file具有可读权限则返回真
[ -L $file ] 如果给点的文件file是一个符号链接文件则返回真
5 字符串比较
1 使用字符串比较的时候,最好使用双中括号,因为有时候采用单个中括号会产生错误
2 [[ $str1 = $str2 ]],当str1等于str2的时候,返回真
[[ $str1 != $str2 ]],当str1不等于str2的时候,返回真
[[ $str1 > $str2 ]],当str1大于str2的时候,返回真
[[ $str1 < $str2 ]],当str1小于str2的时候,返回真
[[ -z $str ]]如果str是空字符串返回真
[[ -n $str ]]如果str是非空字符串则返回真
6 test命令同样可以用来执行条件检测,有助于避免过多的括号
2.1 用cat进行拼接
1 cat命令是一个日常会使用到的简单命令,cat本身表示concatenate(拼接)
2 用cat读取文件的一般格式是
cat file1 file2 file3.... // 这个命令将命令行参数的文件内容拼接在一起输出
3 cat命令不仅可以读取文件并拼接数据,它还能够从标准输入中进行读取。要从标准输入中读取,就要使用管道
stand_ouput | cat
4 cat命令可以用来压缩多个空行,使得被压缩成为单个
cat -s file
5 tr命令也可以把多个的'\n'字符压缩成为单个'\n'
6 cat命令的-n选项会在输出的每一行内容之前加上行号,但是这个并不会修改文件的内容
2.2 录制与回放终端会话
1 script和scriptreplay命令在绝大多数GNU/Linux发行版本上面都可以找到
2 scritp命令同样可以用于建立多个用户之间的进行广播的视频会话
第一步:打开两个终端T1和T2
第二步:在T1中输入mkfifo scriptfifo
第三步:在T2中输入以下命令cat scriptfifo
第四步:在T1中输入以下命令script -f scriptfifo
第五步:在T1中输入的commands都可以在T2中看到
2.3 文件查找与文件列表
1 find是UNIX/Linux命令行工具箱中最棒的工具之一
2 find命令的工作方式如下:沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作
3 要列出当前目录及子目录下的所有文件以及文件夹:find base_bash
4 find命令的两个重要的参数
-print 指明打印匹配文件的文件名,当使用-print的时候,'\n'做为分割文件的定界符
-print0 指明使用'\0'作为定界符来打印每一个匹配的文件名
5 根据文件名或正则表达式匹配搜索,-name的参数指定了文件名所匹配的字符串。
比如 find . -name "*.txt" -print // 命令查找当前目录下的所有txt文件并打印出来
6 find命令有一个选项-iname,该选项的作用和-name类似,但是匹配的时候会忽略大小写
7 find命令也可以用!来否定参数意思
find . ! -name "*.txt" -print // 命令的作用是找出当前目录下的所有非txt文件
8 find命令在使用时候会遍历所有的子目录,我们可以采用深度参数来限制find命令的遍历深度。
-maxdepth和-mindepth指定最大的递归深度以及最少的递归深度(从哪一层开始向下搜索)
9 -maxdepth和-mindepth应该做为find的第三个参数出现,这样就可以第一时间限制搜索的条件,效率会提高的很多
10 类UNIX系统将所有的一切都视为文件,文件具有不同的类型,例如普通文件,目录,字符设备,块设备,符号链接,硬链接,套接字以及FIFO等
11 find命令的-type选项可以对文件搜索进行过滤
12 type参数来匹配所需要的文件类型
文件类型 类型参数
普通文件 f
符合链接 l
目录 d
字符设备 c
块设备 b
套接字 s
fifo p
13 删除匹配的文件,-delete可以用来删除find查找到的匹配文件
find . -type f -name "*.txt" -delete // 命令的作用是find找出当面目录下的所有txt文件,然后删除
14 基于文件权限和所有权进行搜索
find . -type f -name "*.txt" -perm 644 -print // 命令的作用是找到当前目录下所有权限为644的txt文件
2.4 用tr进行转换
1 tr可以用来对标准输入的字符进行替换,删除以及压缩,它可以将一组字符变成另一组字符,因而通常也被称为转换命令
2 tr只能通过stdin,而无法通过命令行参数来接受输入。
tr [options] set1 set2 // 将来自stdin的输入字符从set1映射到set2,并将其输入到stdout。
set1和set2是字符类或字符集,如果两个字符集的长度不相等,那么set2会不断重复其最后一个字符直到和set1长度相等,如果set2长度大于set1那么在set2中超出set1的部分长度就全部忽略
3 将输入字符由大写转换成小写 ,可以使用以下命令
echo "HELLO WHO IS THIS" | tr 'A-Z' 'a-z' // 'A-Z和‘a-z’都是集合
4 tr有一个选项-d可以通过指定需要被删除的字符集合,将出现的stdin中的特定字符删除
echo "Hello 13 world 345" | tr -d '0-9' // 命令可以将stdin中的数字删除并输出
5 我们可以利用选项-c来使用set1的补集,-c set1等同于定义了一个集合,这集合中的字符不包含在set1中
6 tr可以像使用集合一样使用各种不同的字符类,这些字符类型如下所示
alnum: 字母和数字
alpha: 字母
cntrl: 控制字符
digit: 数字
graph: 图形字符
lower: 小写字母
print: 可打印字符
punct: 标点符号
space: 空白字符
upper: 大写字母
xdigit: 十六进制字符
7 可以按照下面的方式选择要使用的字符集: tr [:class1:] [:class2:]
2.5 排序,单一和重复
1 sort命令既可以从特定文件也可以从stdin中获取输入,并将输入写入stdout,uniq的工作模式和sort一样
2 我们可以按照下面的方式轻松的对一组文件进行排序
sort file1 file2 file3 ... > sorted // 命令把多个文件排序然后重定向到sorted
3 按数字进行排序: sort -n file
按逆序进行排序: sort -r file
按月份进行排序: sort -M file
4 如果需要合并两个排过序的文件,而且不需要对合并后的文件再进行排序,可以使用
sort -m sorted1 sorted2
5 uniq命令通过消除重复内容,从给定输入中找出单一的行。它也可以用来找出输入中出现的重复行
6 uniq只能用于排过序的数据输入,因此uniq要么使用管道,要么使用排过序的文件做为输入
只显示唯一的行: uniq -u sorted
统计个行中出现的次数: uniq -c sorted
找出文件中重复的行: uniq -d sorted
2.6 分割文件和数据
1 生成一个大小为100KB的测试文件
dd if=/dev/zero bs=100K count=1 of=data.file
上面的命令会创建一个大写为100KB的文件内容全部都是0
2 我们可以指定分割大小,将文件分割成多个更小的文件
split -b 10k data.file // 这个命令将data.file分割成多个文件,每个文件大小为10KB
2.7 根据扩展名切分文件名
1 借助%我们可以轻松将名称部分从“名称.扩展名"这种格式的文件名中提取出来
2 ${var%.*}的含义是
第一:从$var中删除位于%右侧的通配符所匹配的字符串,通配符从右向左进行匹配
第二:给var进行赋值,var=sample.jpg,那么通配符从右向左匹配到.jpg,因此删除之
3 %属于非贪婪操作,它从右到左匹配通配符的最短结果。还有一个是%%是贪婪的,匹配最长的结果
4 类似的#和%的一样,就是它的匹配是从左到右,属于非贪婪操作
那么##和%%类似
3.1 生成任意大小文件
1 创建特定大小的文件最简单的方法是使用dd命令,dd命令会克隆给定的输入内容,然后将一份一模一样的副本写道输出
2 stdin,设备文件,普通文件等都可以作为输入,stdout,设备文件,普通文件等也可以作为输出
3 例子: dd if=/dev/zero of=data bs=1M count=1
该命令会在当面目录创建一个1MB大小的文件data,来看一下参数,if代表输入文件,of代表输出文件,bs代表以字节为单位的块大小,count表示要被复制的块数
4 我们将bs指定为1MB,count为1,于是得到了一个大小为1MB的文件,如果把count指定为2则得到2MB的文件
5 /dev/zero是一个字符设备,他会不断返回0值字节(\0)
6 如果不指定输入参数,默认情况是从stdin中读取输入,与之类似,如果不指定输出参数则默认会将stdout作为输出
3.2 文本文件的交集和差集
1 comm命令可以用于两个文件之间的比较,它有很多不错的选项来调整输出
2 例子: comm fileA fileB
输出的第一列包含在fileA中出现行,第二列包含在fileB中出现的行,第三列包含在fileA和fileB中相同的行
有一些选项可以按照我们需求进行格式化输出
-1 从输出中删除第一列
-2 从输出中删除第二列
-3 从输出中删除第三列
3.3 查找并删除重复文件
1 重复文件指的是那些虽然名字不同但是内容却一模一样的文件
2 校验和是通过文件的内容来的,内容相同的文件校验和是一样的
3.4 创建长路径目录
1 mkdir命令用于创建目录,如果目录已经存在会返回错误信息
2 -e是条件判断[]中的参数,可以用来判断某个文件是否存在,在类UNIX中,目录同样是一个文件
3.5 文件权限和所有权
1 用户是文件所有者,用户组是多个用户的集合,系统允许这些用户对文件以某种形式进行访问
2 用命令ls -l可以列出文件的权限
比如: -rw-r--r-- 1 chenguolin chenguolin 2497 2014-01-19 21:02 hehe.txt
3 第一列总共有10个字符,第一个字符表示的是文件的类型,'-'是普通文件,'d'是目录文件,’c'字符设备等等
剩下的9个字符可以分成三组,每组三个字符。第一组的三个字符是用户权限,第二组的三个字符是用户组权限,第三组的三个字符是其他用户。
权限序列rwx,分别表示读写执行权限
4 目录同样也具有读写执行权限,不过目录相对于普通文件来说是不一样的
目录的读权限r 允许读取目录文件和子目录的列表
目录的写权限w 允许目录中创建或删除文件或目录
目录的执行权限 指明可以访问目录中的文件和子目录
5 为了设置文件权限,可以使用chmod命令
chmod u=rwx g=rw o=r filename
在这里: u指的是用户权限,g指的是用户组权限,o是指其它人实体权限
如果需要给文件添加权限,可以对用户,用户组和其他用户+进行添加,用-进行删除权限
我们也可以利用八进制来设置权限,权限由3位数来表示,每一位按顺序分别对应用户,用户组和其他用户
r对应的值为4,w对应的值为2,x对应的值为1
6 我们可以使用chown来更改文件的所有权
chown user.group filename // 这样是把文件filename的所有者改为user,用户组为group
7 有时候要以递归的方式修改当前目录下的所有文件和子目录的权限,可以使用下面的方法
chmod 777 path -R //这个例子就是递归把path目录下的所有文件的权限修改为777
8 同理我们也可以利用-R来递归修改文件的所有者
chown user.group path -R //这个命令就是递归把path目录下的所有文件的所有者和用户组修改掉
3.6 创建不可修改的文件
1 一旦文件被设置为不可修改,任何用户包括超级用户都不能删除该文件,除非其不可修改的属性被移除
2 可以用chattr将文件设置为不可修改
sudo chattr +i file //这样文件file就变为了不可修改
3 如果需要使得文件可以写,直接使用sudo chattr -i file来修改权限
3.7 批量生成空白文件
1 touch命令可以用来生成空白文件,如果文件存在,则可以用它来修改文件的时间撮
2 touch file // 如果文件不存在则创建一个文件否则直接修改该文件的时间戳
3 如果我们只是想修改某些时间戳,则可以使用下面的选项
touch -a 只更改文件访问时间
touch -m 只更改文件内容修改时间
3.8 查找符号链接及其指向目标
1 符号链接不过是指向其他文件的指针,它在功能上类似Mac OS中的别名或windows中的快捷方式
2 我们可以按照下面的方式创建链接
ln -s file link //该命令为文件file创建一个连接link
3.9 列举文件类型统计信息
1 我们可以使用file命令来打印文件类型
file filename //可以打印处filename的文件类型
3.10 环回文件及挂载
1 为了使用存储设备上面的文件系统,我们需要将其挂载到一些被称为挂载点的目录上
2 前面介绍了可以使用dd命令创建一个大的文件,那么我们可以使用mkfs这个命令来格式化设备
mkfs.ext4 /dev/sdb1 // 这个命令就是把/dev/sdb1格式化成ext4文件类型
3 我们可以使用mount来挂载
mount /dev/sdb1 /mnt/usb //这个命令就是把/dev/sdb1 挂载到/mnt/usb
4 如果要卸载使用下面的方法
umount /dev/sdb1 或 umount /mnt/usb
因为umount是一个特权命令,所以必须以超级用户的身份来执行
3.11 查找文件差异进行修补
1 我们可以使用patch(补丁文件)来更改文件信息
2 diff命令可以用来比较两个文件,最常用的用法是diff fileA fileB
我们还可以使用-u选项来进行一体化输出 diff -u fileA fileB
3 在一体化输出中,以+起始的是新加入的行,以-起始的是删除的行
diff -u fileA fileB > patch // 这个命令把两个文件的差异信息重定向到patch文件
4 用下面的命令来修补
patch -p1 file < patch // 这个命令可以把file进行差异更新
如果要撤销修改直接进行同样的命令即可
3.12 head和tail
1 head命令总是读取输入文件的头部 head file打印文件file的前10行
2 seq命令可以用来快速的生成一个序列 seq 11用来生成1~11的序列
3 tail命令打印文件的最后10行 tail file
3.13 只列出目录的方法
第一种:ls -d */ // 只有上面这种结合-d的用法才能够只打印出目录
第二种:ls -F | grep "/$" // 当使用-F时,所有输出项都会添加上一个代表文件类型的字符
第三种:ls -l | grep "^d" // ls -l输出的每一行,然后利用grep找到第一个字符是d的
第四种:find path -maxdepth 1 -type d -print // find命令指定最大的查找深度还有文件类型
3.14 统计文件的行数,单词数和字符数
1 wc是一个用于统计的工具,它是word count的缩写
2 统计行数: wc -l file
统计单词数: wc -w file
统计字符数: wc -c file
wc file默认打印出文件行数,单词数还有字符数
3 wc file -L可以用来打印出最长行的长度
3.15 打印目录树
1 tree命令是以图形化的树状结构打印文件和目录的主角,通常在Linux的发型版本中并没要该命令
2 tree path // 这个命令可以直接以树形来显示
3 以HTML形式输出目录树
tree path -H http://localhost -o out.html
将http://localhost替换为适合存放输出文件的URL,将path替换为真的路径,然后就可以生成web版的目录树
4.1 正则表达式入门
1 正则表达式是基于样式匹配的文本处理技术的关键所在
2 正则表达式是用于绝大多数文本处理工具的一种语言
3 正则表达式的基本组成部分
正则表达式 描述
^ 行起始标记
$ 行尾标记
. 匹配任意一个字符
[] 匹配包含在[]之中的任意一个字符
[^] 匹配除了[]之外的任意一个字符
[-] 匹配[]中指定范围内的任意一个字符
? 匹配之前的项1次或0次
+ 匹配之前的项1次或多次
* 匹配之前的项0次或多次
{n} 匹配之前的项n次
{n,} 匹配之前的项至少n次
{n,m} 匹配之前的项至少n次最大m次
4 为了匹配一个IP地址,可以使用下面的正则表达式
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
我们知道IP地址通常是由点号分割的4个整数,每个整数的值是0-255
5 我们在字符前面放一个”\",这种做法是称为对字符的转制
4.2 用grep在文件中搜索文本
1 grep命令是UNIX中用于文本搜索的大师级工具,它能够接受正则表达式和通配符
2 在文件中搜索一个单词: grep word file
3 grep命令也可以对多个文件进行搜索: grep word file1 file2 file3...
4 如果想要打印包含word之外的所有行可使用: grep -v word file
5 统计文件或文本中包含匹配字符串的行数: grep -c word file
6 打印出包含匹配字符串的行数: grep -n word file
7 如果需要在多级目录中对文本进行递归搜索,可以使用: grep word path -R -n
8 忽略样式中的大小写: grep -i word file
9 打印出匹配文件之前或之后的行
要打印匹配某个结果之后3行: grep word -A 3 file
要打印匹配某个结果之前的3行: grep word -B 3 file
要打印匹配某个结果的之前及之后3行: grep word -C 3 file
4.3 用cut按列切分文件
1 cut是一个帮我们将文本按列进行切分的小工具,它也可以通过指定定界符
2 为了提取第一个字段或列,可以使用下面的方法
cut -f field_list file // field_list是要显示的列
3 cut -f 2,3 file // 这条命令将显示第2,第3列
4 我们也可以利用-complement选项对提取的字段进行补集运算,假设有多个字段,你希望打印出除了第3列之外的所有列,则可以使用: cut -f3 --complement file
5 要指定字段的定界符,使用-d选项: cut -f2 -d";" file // 命令显示第2列,用";"做为分割符
6 如果要切分出第n到m个字符可以使用: cut -cn-m file
4.4 sed入门
1 sed是stream editor(流编辑器)的缩写,它是文本处理中非常重要的工具,它能够完美的配合正则表达式使用,功能不同反响
2 sed可以替换给文本中的字符串,它可以利用正则表达式进行匹配
sed 's/pattern/replace_string/' file
3 如果使用-i选项,可以将替换结果应用于原文件: sed -i 's/pattern/replace_string/' file
4 用sed移除空白行: sed '/^$/d' file
5 利用管道组多个sed命令这种方法可以用下面的方式替换: sed expression | sed expression 等价于sed 'expression ; expression'
4.5 awk入门
1 awk脚本的结构基本如下所示: awk 'BEGIN{statement} pattern{statement}END{statement}'
2 一个awk脚本通常有三个部分组成:BEGIN语句块,END语句块和能够使用模式匹配的语句块。这三个部分是可选的,它们中的任何一个部分都可以不出现在脚本中,脚本通常包含在单引号中或双引号中
3 awk命令的工作方式
(1) 执行BEGIN{statement}语句块中的语句
(2) 从文件或stdin中读取一行,然后执行pattern{statement},重复这个过程,直到文件全部读取完毕
(3) 当读至输入流末尾的时候,执行END{statement}语句块
4 BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,诸如变量的初始化,打印输出表格的表头语句等等
5 END语句块和BEGIN类似,END语句在awk从输入流中读取完毕之后被执行,像打印所有行的结果这类信息一般都是放在END语句块中执行
6 最终要的部分是pattern语句块中的部分,这个语句块同样也是可选的,如果不提供,则默认执行print,即打印每一个读取的行
7 当使用不带参数的pring时,它会打出当前行。关于print,需要记住的是:当pring的参数是以逗号进行分割时,参数打印则以空格做为定界符,在awk的print中双引号是被当做拼接操作符使用的
8 awk的一些特殊变量
NR: 表示记录数量,在执行的过程中相当于当前行号
NF: 表示字段数量,在执行过程中对应于当前行的字段数
$0: 这个变量包含执行过程中当前行的文本内容
$1: 这个变量包含第一个字段的文本内容
$2: 这个变量包含第二个字段的文本内容
9 通常grep是默认读取一个文件的所有行,如果只想读取某一行,可以使用getline
10 awk有很多内置的函数
length(string): 返回字符串的长度
index(string, search_string): 返回search_string在字符串中的出现的位置
split(string, array, delimiter): 用定界符生成一个字符串列表,并将该列表存入数组
4.6 替换文本或文件中的字符串
1 可以使用下面的方式替换一个字符串或样式
sed 's/pattern/replace_string/g' file //这条命令会替换所有匹配到的项,/g的意识是全局(global),这就意味着它会替换文件中所有匹配的内容
2 当文件名传递给sed的时候,sed将输出写到stdout,如果不想把输出结果输送到stdout,而是将更改保存到原文件中可以使用-i选项 sed 's/pattern/replace_string/g' -i file
4.7 按列合并文件
1 可以使用paste命令实现按列拼接: paste file1 file2 file3
2 默认的定界符是制表符,也可以使用-d来明确指定定界符
paste file1 file2 -d "," // 指定定界符是","
4.8 打印文件或行中的第n个单词或列
1 用下面的命令打印第五列
awk '{print $5}' file // 这个命令将打印文件file的第五列
2 要打印从M行到N行这个范围的所有文本,使用下面的语法
awk 'NR==N , NR==M' file
3 命令tac可以做到逆序打印文件
seq 5 | tac // 这个命令将输出5 4 3 2 1
tac file // 这个命令将逆序打印处文件file
4 用awk实现head和tail还有tac
awk 'NR <= 10' file // 这个命令默认打印处文件file的前10行
awk '{buffer[NR%10]=$0}END{for(i=1;i<11;i++)print buffer[i%10]} file // 这个命令默认打印文件file的最后10行
awk '{buffer[NR]=$0}END{for(i=NR;i>0;i--)print buffer[i]}' file // 这个命令默认打印逆序打印出文件file
6.1 用tar归档
1 tar命令可以用来归档文件,可以用tar将多个文件和文件夹保存为单个文件,同时还能保留所有文件属性,如所有者,权限等,由该命令创建的文件通常称为tarball
2 按照下面的方法,用tar对文件进行归档: tar -cf output.tar sources
例如tar -cf output.tar file1 file2 file3....
命令中的-c代表的是创建文件,-f代表的是指定文件名
3 向归档中添加文件可以使用下面命令: tar -rvf output.tar new_file
4 用下面的方法列出归档文件的内容: tar -tf output.tar
5 如果需要在归档或列出归档内容的过程中获知更多细节,可以使用-v或-vv选项,它们允许在终端中输出更详细的信息
6 下面的命令可以将归档文件的内容提取到当前目录中: tar -xf output.tar
-x表示把当前归档文件中的内容提取到当前目录,我们可以使用-C选项指定需要提取到的目录
tar -xf output.tar -C path
7 连接两个归档文件: tar -Af file1.tar file2.tar // -A选项用来把两个归档文件进行合并
8 从归档文件中删除文件: tar -f output.tar --delete file1 file2 // 命令把归档文件中的file1和file2删除
9 从归档中排除部分文件
例如,排除所有的.txt文件: tar -cf output.tar * --exclude "*.txt"
也可以将需要排除的文件列表放入到文件中: tar -cf output.tar * -X file
6.2 用cpio归档
1 cpio是类似于tar的另一种归档格式,它用来将多个文件和文件夹存储为单个文件,同时保留所有文件属性,如权限,文件所有权等
2 cpio通过stdin获取输入文件名,并将归档文件写入stdout,我们必须将stdout重定向到一个文件,以接收cpio的输出
创建测试文件: touch file1 file2 file3
将测试文件按照下面的方法进行归档: echo file1 file2 file3 | cpio -ov > output.tar
3 要列出cpio归档文件中的内容,使用下面命令: cpio -it < output.tar // 这个命令列出给定的cpio归档文件中的所有内容
-i用于指定输入 -t 表示列出归档文件中的内容
6.3 用gunzip或gzip压缩
1 gzip是GNU/Linux平台下常用的压缩格式,gzip只能够压缩单个文件,而无法对目录和多个文件进行归档,因此我们一般把这个任务交给tar,然后再用gzip压缩
2 要使用gzip压缩文件,可以使用下面的命令: gzip filename
3 将gzip文件解压缩的方法如下: gunzip filename.gz
4 要列出压缩文件的属性信息: gzip -l filename.gz
5 zcat命令无需解压缩,直接读取gzip格式文件
zcat filename.gz // 这个命令可以直接读取压缩文件的内容
6 压缩率,我们可以指定压缩率,压缩率有9级,其中:
1级的压缩率最低,但是压缩速度最快; 9级的压缩率最高,但是压缩速度最慢
6.4 用bunzip和bzip压缩
1 bunzip是另一种以gzip类似的压缩技术
2 用bzip2进行压缩: bzip2 filename // bzip2会删除源文件并生成名为filename.bz2文件
3 解压缩bzip2格式文件: bunzip2 filename.bz2
4 使用bzip2或bunzip2时,它会删除输入文件并生成压缩过的输出文件,我们可以使用选项-k来避免删除输入文件
bunzip2 filename.bz2 -k
6.5 用lzma压缩
1 使用lzma进行压缩: lzma filename // lzma会删除原文件并生成名为filename.lzma
2 保留输入文件: 使用lzma或unlzma时,它们会删除输入文件并生成压缩过的输出文件,不过我们可以指定选项-k来避免删除原文件
6.6 用zip归档和压缩
1 zip做为一种流行的压缩格式,在很多的平台中都可以看到它的身影
2 对归档文件采用zip格式进行压缩: zip output.zip source //该命令会生成output.zip文件
3 对目录和文件进行递归操作: zip -r output.zip directory
4 要从zip文件中提取内容,可以使用: unzip output.zip //unzip这个命令并不会删除output.zip文件
5 从压缩归档文件中删除内容,则使用-d: zip -d output.zip file //这个命令删除压缩文件中的file
6 列出归档文件中的内容: unzip -l output.zip
6.7 加密工具与散列
crypt
1 crypt是一个简单的加密工具,它从stdin接受一个文件以及口令,做为输入,然后将加密数据输出到output
2 crypt < input_file > output_file
Enter passphrase:
gpg
1 gpg是一种应用广泛的加密方案,它采用密钥签名技术保护文件内容,只有经过认证的用户才能访问数据
2 用gpg加密文件: gpg -c filename //这条命令采用交互式读取口令,并生成filename.gpg
3 解密gpg文件: gpg filename.gpg // 这条命令读取口令,然后对文件进行解密
md5sum与sha1sum
1 md5sum与sha1sum都是单向散列算法,均无法拟推出原始数据,它们通常用于验证数据完整性或为特定数据生成唯一的密钥
2 它们可以为每个文件生成一个唯一的密钥: md5sum file 或 sha1sum file
6.8 用rsync备份系统快照
1 rsync可以对位于不同位置的文件和目录进行备份,它可以借助差异计算以及压缩技术来最小化数据传输量
2 将源目录复制到目的端: rsnyc -av source_path destination_path
其中-a表示要进行归档,-v表示在标准输出上打印出细节信息或进度
3 要将数据备份到远程服务器或主机,可以使用: rsnyc -av source_dir username@host:path
用下面的方法可以将远程主机上的数据恢复到本地主机: rsnyc -av username@host:path destination
rsnyc命令用ssh连接到远程主机,用user@host这种形式设定远程主机的地址,其中user代表的是用户名,host代表的是远程主机的ip地址或域名
6.9 用dd克隆磁盘
1 dd命令原意是data definition,由于不正确的使用会导致数据丢失,因此它获得了data destrory这一虐称
2 dd的语法如下: dd if=source of=target bs=block_size count=count
if代表输入文件或输入设备路径
of代表目标文件或目标设备路径
bs代表块大小,count则是需要复制的块数,bs和count都是可选的
3 要将一个分区复制到文件中,可以使用:dd if=/dev/sda1 of=sda1_partition.img //该命令中的/dev/sda1是该分区的设备路径
用备份恢复分区: dd if=sda1_partition.img of=/dev/sda1
4 如果要永久性删除一个分区中的所有数据,我们可以使用dd向该分区中写入0值
dd if=/dev/zero of=/dev/sda1 // /dev/zero是一个字符设备,它总是返回字符'\0'
5 在容量相同的硬盘间进行克隆: dd if=/dev/sda of=/dev/sdb
7.1 联网知识入门
1 网络上每一个节点都需要分配多个参数才能够与其它主机顺利实现互联,这些参数包括子网掩码,网关,路由,端口,DNS等
2 ifconfig命令用于显示网络接口,子网掩码等详细信息
3 ifconfig是位于/sbin/ifconfig,当输入该命令的时候,一些GNU/Linux发行版本会显示错误,在Debian中,ifconfig默认是不可用的,因为/sbin并不包括在PATH中
4 /sbin/ifconfig是一个绝对路径,所以要用这个绝对路径运行ifconfig,在每个系统中,默认都有一个称为环回接口的lo,这个接口指向当前主机本省
5 要设置网络接口的IP地址,可以使用: ifconfig wlan0 192.168.0.80
6 要设置IP地址的子网掩码: ifconfig wlan0 192.168.0.80 netmask 255.255.255.0
7 分配给当前系统的名字服务器可以通过读取/etc/resolv.conf来查看
8 获取IP地址最简单的方法就是ping给定的域名,然后查看回应信息,例如: ping www.google.com
9 有多种命令行DNS查找工具,这些工具会向DNS服务器请求IP地址解析。而host和nslookup就是两个DNS查找工具
10 一个域名可以分配多个的IP地址,比如www.google.com可以对应多个的IP地址,而一个IP地址只是对应一个域名
11 设置默认网关: route add default gw IP_ADDRESS INTERFACE_NAME
比如: route add default gw 192.168.0.1 wlan0
12 分组要穿过这些网关才能到达目的地,有一个很有意思的命令traceroute,它可以显示分组途径的所有网关的地址,traceroute信息可以帮组我们搞明白分组到达目的地需要经过多少跳
7.2 使用ping
1 ping是一个验证网络上两台主机联通性的诊断工具,能够用来找出网络上的活动主机
2 为了检查网络上两台主机之间的联通性,ping命令使用互联网控制消息协议的echo分组,当这些echo分组发送到某个主机的时候,如果分组能够送达且该主机为活动主机,那么它就会发送一条回应
3 检查某个主机是否可以到达: ping ADDRESS // ADDRESS是主机名,域名或IP地址
4 ping命令会不停的发送echo分组,并等待回复,直到Ctrl+C,不过,我们可以使用-c来限制所发送的echo分组的数量
ping 192.168.0.1 -c 2 // 这个命令会限制发送的分组数量为2
5 ping命令如果执行顺利,会返回退出状态0,否则返回非0
7.3 列出网络上所有的活动主机
1 在这则攻略中,我们采用两种方法,第一种方法是使用ping,第二种方法是fping。fping并没有默认包含在Linux发行版中
2 fping命令的几个选项如下所示:
选项-a 指定打印出所有活动主机的IP地址
选项-u 指定打印出所有无法到达的主机
选项-g 指定从写作IP/mask的“斜线-子网掩码”记法或者起止IP地址记法中生成IP地址范围
7.4 传输文件
1 用来在网络上传输文件的命令多数都已默认包含在安装好的Linux中,通过FTP传输文件可以使用lftp命令,通过SSH传输文件可以使用sftp,RSYNC使用SSH与rcync命令,借助scp通过SSH进行传输
2 文件传输协议FTP是一个古老的用于网络主机之间传输文件的文件传输协议
我们可以使用lftp命令可以访问FTP服务器以便传输文件,它使用端口21,只有远程主机上面安装有FTP服务器才能使用FTP
3 要连接FTP服务器可以使用: lftp username@ftphost
4 连接上FTP服务器之后,我们可以在提示符之后使用如下命令:
用cd directory改变目录
用lcd改变本地主机的目录
用mkdir创建目录
用get filename下载文件到当前主机的目录
用put filename从当前主机目录上传文件
用quit来退出lftp会话
5 SFTP是一个类似FTP的文件传输系统,它运行在SSH连接之上,SFTP利用SSH连接模拟FTP接口
6 运行sftp: sftp user@domainname
7 SCP是一项比传统远程复制工具rcp更安全的文件复制技术,文件都是通过SSH加密通道进行传输的
我们可以使用像下面这样轻松地将文件传输到远程主机: scp filename user@remotehost: /home/path
8 将远程主机中的文件复制到当前目录,并采用给定文件名: scp user@remotehost:/home/path/filename filename
9 使用scp的-r选项,我们可以在两台网络主机之间对文件进行递归复制: scp -r /home/slynux user@remotehost:/home/backups
7.5 用SSH在远程主机上运行命令
1 SSH是一个很有意思的系统管理工具,它能够通过shell登录并控制远程主机。
2 用下面的方法连接运行SSH服务器的远程主机: ssh username@remote_host
username是远程主机上的用户,remote_host可以是域名或IP地址
3 ssh服务器默认在端口22运行,不过,有些运行在ssh服务的服务器并不在这个端口运行,针对这种情况,用ssh命令的-p port_no指定端口
ssh username@localhost -p 422
7.6 在网络上发送多播式窗口消息
1 可以用zenity来实现一个GUI弹出窗口,zenity是一个脚本化的GUI工具,用来创建包括文本框,输入框等在内的窗口
2 要用zenity创建一个信息框,可以使用: zenity --info --text "this is a message"
这条命令会显示一个窗口,上面显示文本“this is a message"
3 netstat是一个用于网络服务分析的命令
8.1 统计磁盘的使用情况
1 磁盘空间是一种有限资源
2 df和du是Linux中用于统计磁盘使用情况的重要命令,df是disk free的缩写,du是disk usage的缩写
3 找出某个文件(或多个文件)占用的磁盘空间: du file1 file2 ... // 统计结果默认是以字节作为计算单位
4 要获得某个目录中所有文件的磁盘使用情况,并在每一行中显示各个文件的磁盘占用详情,可以使用
du -a DIRECTORY // -a递归的输出指定目录或多个目录中的所有文件的统计结果
5 命令du默认显示文件占用的总字节数,但是以标准的KB,MB,GB显示磁盘使用情况,可以使用-h选项
du -h file // 命令将显示文件的占用的KB
6 du的选项-c可以输出作为命令参数的所有文件和目录的磁盘使用情况总计,它会在输出结果末尾加上一行总计
du -c file1 file2 // 命令会在最后一行总结所有文件或目录的磁盘使用情况
7 我们可以强制du使用特定的单位打印磁盘使用情况
du -b file //打印以字节为单位的文件大小
du -k file //打印以KB为单位的文件大小
du -m file //打印以MB为单位的文件大小
du -B file //打印以BLOCK_SIZE为单位的文件大小
8 有时候我们需要从磁盘使用统计中排除部分文件,可以使用两种方法
(1)通配符
du --exclude "word" DIRECTORY
du --exclude "*.txt" /path //命令排除所有的.txt文件
(2)排除列表
du --exclude-from EXCLUDE.txt DIRECTORY //EXCLUDE.txt包含了需要排除的文件列表
9 我们可以使用 --max-depth指定du应该遍历的目录层次的最大深度,将深度指定为1,可以统计当前目录下的所有文件占用内存的情况,将深度指定为2,可以统计当前目录下以及下一级子目录文件占用内存的情况
du --max-depth 2 DIRECTORY
10 找出指定目录中的最大的10个文件: du -ak source_dir | sort -nrk 1 | head
其中-a指定了所有的目录和文件,因此du会遍历source_dir并计算所有文件的大小,由于指定了选项-k,输出的第一列会包含以KB为单位的文件大小,第二列包含文件或文件夹的名称
11 du提供磁盘使用情况信息,而df提供磁盘可用空间信息。该命令用或不用选项-h皆可。如果用-h则会以易读的格式打印磁盘空间信息
8.2 计算命令执行时间
1 所有的类UNIX操作系统都包含time命令,你可以将time放在需要计算执行时间的命令之前
time command //command会执行并生成输出
输出中分别显示了执行该命令所花费的real时间,user时间以及system时间
real时间指的是挂钟时间,也就是命令从开始执行到结束的时间
user时间指的是进程花费在用户模式中的cpu时间,这是唯一真正用于执行进程所花费的时间
sys时间指的是进程花费在内核模式中的cpu时间
8.3 与当前登录用户,启动日志以及启动故障的相关信息
1 要获取当前登录用户的相关信息可以使用: who 或者是: w
该命令会提供当前登录的用户,用户所使用的伪终端TTY,伪终端当前所执行的命令以及用户登录的IP地址
2 TTY是与文本终端相关联的设备文件
3 要列出当前登录主机的用户列表可以使用: users
如果用户打开了多个伪终端,那么在同一个用户会多次显示
4 要查看系统已经运行了多长时间,可以使用:uptime
5 要获取前一次的启动以及用户登录会话的信息,可以使用:last
如果要获取单个用户的登录会话信息,可以使用:last user
8.4 用watch监视命令输出
1 watch命令可以用来在终端中以固定的间隔监视命令输出,watch command
命令默认每2秒更新一次输出
2 我们可以使用-n second指定需要更新输出的时间间隔
watch -n 5 command //命令将指定5秒更新一次输出
9.1 收集进程信息
1 进程是程序的运行实例,运行在一台计算机中的多个进程各自分配了一个称为进程ID的唯一标识数字
2 同一个程序的多个实例可以同时运行,但是他们的进程ID却互不相同
3 一个进程包括多种属性,例如拥有该进程的用户,进程使用的内存数量,进程占用的CPU等
4 ps是收集进程信息的重要工具,它提供了信息包括:拥有进程的用户,进程的起始时间,进程所对应的命令行路径,进程ID,进程所属的终端,进程使用的内存,进程占用的CPU
5 top对应系统管理员来说是一个极为重要的命令,top命令默认输出一个占用cpu最多的进程列表
6 借助ps命令可以找到命令名称对应的进程ID: ps -c command_name
9.2 杀死进程以及发送或响应信号
1 在类UNIX环境中与进程相关的一个重要的概念就是信号,信号是一种进程间的通信机制,它用来中断运行的进程以执行某些操作
2 列出所有可用的信号: kill -l
3 终止一个进程: kill process_id // kill命令默认发出一个term信号
4 我们最经常用打的信号具体如下所示:
SIGHUP 1 ---- 对控制进程或终端进行挂起检测
SIGINT 2 ---- 当按下Ctrl+C时发送该信号
SIGKILL 9 ---- 用于强行杀死进程
SIGTERM 15 ---- 默认用于终止进程
SIGTSTP 20 ---- 当按下Ctrl+Z时发送该信号
5 强行杀死进程
kill -s SIGKILL process_id 或 kill -9 process_id
6 killall命令通过命令名终止进程: killall process_name
killall强行杀死进程: killall -9 process_name
9.3 which/whereis/file/whatis平均负载
1 which命令用来找出某个可执行程序的位置
2 我们在终端输入命令的时候无需知道对应的可执行文件位于何处,终端会在一组位置中查找这个命令,如果可以找到,那么就执行该可执行文件,这一组位置由环境变量PATH指定
3 我们可以导出并添加我们自己的命令搜索位置: export PATH=$PATH:/home/chenguolin/bin //这个命令把/home/chenguolin/bin 添加到环境变量PATH
4 whereis命令不仅返回命令的路径,还能够打印处其对应的命令手册的位置以及命令源代码的路径
例如: wheris ls
5 file命令是一个用来确定文件类型的命令
file FILENAME //命令会打印出文件FILENAME的类型
6 whatis命令会输出作为参数的命令的简短描述信息: whatis ls
9.4 向用户终端发送信息
1 wall命令用来向所有当前登录用户的终端写入消息,它可以将这消息传递给一台服务器中所有当前登录用户或是多台分散主机中的用户
2 向终端中的所有的当前登录用户发送消息: echo "hello" | wall // 这个命令会向所有的登录用户发送"hello",wall命令是接收来自标准输入的数据
9.5 收集系统信息
1 打印当前系统的主机名: hostname 或 uname -n
2 打印Linux内核版本,硬件结构等详细信息: uname -a
3 打印内核发行版本: uname -r
4 打印主机类型: uname -m
5 打印CPU的相关信息: cat /proc/cpuinfo
6 打印内存的详细信息: cat /proc/meninfo
7 列出系统的分区信息: cat /proc/partitions 或 fdisk -l
9.6 用户管理
1 useradd
useradd命令可以用来创建新用户,命令语法图如下: useradd USER -p PASSWORD
选项-m用来创建home目录,也可以提供-c FULLNAME提供用户的全名
2 deluser
deluser命令用来删除用户,命令语法如下: deluser user
--remove-all-files用来删除与用户相关的所有文件,包括home目录
3 chsh命令用来修改用户的默认shell,命令语法: chsh USER -s shell
4 passwd
passwd命令用来修改用户密码,语法如下: passwd USER
5 addgroup
addgroup命令会为系统添加一个新的用户组,命令语法如下: addgroup GROUP
6 delgroup
delgroup命令会删除一个用户组,命令语法如下: delgroup GROUP
9.7 图像文件的批量缩放及格式转换
1 convert命令是一个用来出来图像文件的命令
2 将一种图像格式转换为另一种图像格式: convert file1.jpg file2.png
3 指定缩放比例或输出图像的宽度和高度和将图像进行调整: convert image.png -resize 1024x768 image.png
4 指定百分比缩放: convert image.png -resize "50%" image.png
.1 收集进程信息1 进程是程序的运行实例,运行在一台计算机中的多个进程各自分配了一个称为进程ID的唯一标识数字
2 同一个程序的多个实例可以同时运行,但是他们的进程ID却互不相同
3 一个进程包括多种属性,例如拥有该进程的用户,进程使用的内存数量,进程占用的CPU等
4 ps是收集进程信息的重要工具,它提供了信息包括:拥有进程的用户,进程的起始时间,进程所对应的命令行路径,进程ID,进程所属的终端,进程使用的内存,进程占用的CPU
5 top对应系统管理员来说是一个极为重要的命令,top命令默认输出一个占用cpu最多的进程列表
6 借助ps命令可以找到命令名称对应的进程ID: ps -c command_name
9.2 杀死进程以及发送或响应信号