Linux总结
一、awk
1 、格式:awk [ 参数] '$n~/匹配规则/{执行命令}' 需要处理的文件
2 、-F 指定间隔符
3 、-f 指明awk脚本
4 、$n 选取文本间隔后的第n列。$0 代表整个文本,$1 代表间隔后的第一列数据
5 、~ 用来匹配正则表达式
6 、-v var = val 在执行处理过程之前,设置一个变量var,并给其设置一个初始值val
7 、BEGIN关键字 BEGIN{ 执行命令} 会强制awk在读取数据之前执行该关键字后指定的脚本命令
8 、END关键字 END{ 执行命令} awk会在读取完数据后执行
9 、awk -F " " '{if($1==55) ($1=$1+2); print > "test.txt"}' test.txt
匹配test.txt文件中第一列数据为55的一行数据,并将其第一列数据加2,将文件的修改操作写入到原文件中,交互界面会打印出文件中所有的数据。
10 、awk -F " " '{if($1==57) {$1=$1+2;print}}' test.txt
只打印文件中修改过的数据A
11 、gsub( /s/,t) 在整个文件数据中将s替换为t
gsub( /s/,t,str) 将str中的所有s替换为t
12 、index( s,t) 查询字符串s中t出现的第一个位置,必须用双引号将字符串括起来
13 、length( s) 返回s的长度
14 、match( s,r) 测试s是否包含匹配r的字符串。不存在返回0,存在则返回出现r的第一个位置
15 、split( s,a,fs) 将数据s按照fs分隔符进行分割,分割后的数据存储至数组a中,若要提取数组中的数据可以使用a[ n]
awk 'BEGIN{print split("12/34/56/78",a,"/"); print a[1]}'
将数据"12/34/56/78" 中的数据按照分隔符"/" 进行分割,分割后的数据存储在数组a中,提取数组a中的第一个数据
16 、sub( s,t,r) 将r中第一次出现的s替换为t
17 、substr( str,n1,n2) 从str中的第n1个字 符开始,返回其前面的n2个字符
18 、awk脚本头
19 、精确匹配
awk '$1 == "123" {print $1}' file file文件的第一列数据为123的进行打印输出
20 、不匹配
awk '$1 !~ /123/ {print $1}' flie file文件的第一列数据包含123的进行打印输出
21 、匹配输出
awk '/查找内容/{操作逻辑}'
eg:
awk -F ":" '/server/{print $NF}'
解释:按照冒号进行分割,查找包含server的行,然后打印匹配到的最后一列
22 、需要初始化多个变量
awk 'BEGIN{变量初始化}{实现逻辑}END{结果输出}'
eg:
awk 'BEGIN{num=0;sum=0}{if(NR==1) num=$1; else sum+=$1}END{printf "%.3f", sum/num}'
二、grep
1 、格式:grep [ 选项] 正则表达式/字符串 [ 文件] 输入字符串参数时,最好使用双引号括起来
2 、选项参数
-c 只输出匹配行的计数
-h 查询多文件时不显示文件名
-l 查询多文件时只输出包含匹配字符的文件名
-n 显示匹配行及行号
-s 不显示不存在或无匹配文本的错误信息
-v 显示不包含匹配文本的所有行
-i 不区分大小写(只适用于单字符)
-w 指定匹配的只能是一个完整的单词,不能是其中的一部分
3 、精确匹配
每个匹配模式后加一个< Tab> 键或\ >
4 、模式出现机率
grep '4\{2,\}' 抽取包含数字4至少重复出现两次的所有行
grep '4\{2\}' 抽取包含数字4重复出现两次的所有行
grep '4\{2,6}5' 抽取数字4重复出现2到6次并以5结尾的所有行
5 、grep命令加-E参数,这一扩展允许使用扩展模式匹配
grep -E '219|216' 抽取包含219或216的所有行
三、sed
1 、格式:sed [ 选项] sed命令 输入文件
sed [ 选项] -f sed脚本文件 输入文件
sed脚本文件 [ 选项] 输入文件
2 、选项
-e 后跟脚本命令
-f 后跟脚本文件
-n 屏蔽启动输出
3 、使用p显示行
sed -n '2p' 打印文本第二行
sed -n '1,3p' 打印文本第一到第三行
sed -n '/neave/' p 打印匹配到单词neave的行
sed -n '4,/the/' p 从第四行开始进行匹配查询,直至匹配到the为止
sed -n '1,$p' 打印整个文件,$意为最后一行
sed -n -e '/root/' p -e '/root/=' 打印匹配行及行号 = 会打印行号
4 、附加文本
/000002222299999444477777/ a\
this is text
/3333444444777779999000/ a\
this is text too
脚本解释:脚本第一行是sed命令解释行;第二行以/000002222299999444477777/开始,这是附加操作起始位置,a\ 通知sed这是一个附加操作,应该插入一个新行;第三行是附加操作要加入到拷贝的实际文本。(附加文本的每一行都要添加"\" ,表示换行,最后一行不需要添加)。如果要保存输出,则需要进行重定向。
5、插入文本
#!/bin/sed -f
/77777/ i\
this is text
脚本解释:脚本第一行是sed命令解释行;第二行/77777/在其之前插入第三行的数据,i\通知sed这是一个附加操作,应该插入一个新行;第三行是要插入的文本。
6、修改文本
#!/bin/sed -f
/777/ c\
this is text
脚本解释:脚本第一行是sed命令解释行;第二行/777/是需要修改的行,将其修改为第三行的数据;c\通知sed这是一个附加操作,应该修改一行数据;
7、删除文本
sed '1d' 删除第一行
sed '1,3d' 删除一到三行
sed '$d ' 删除最后一行
sed '/neave/d' 使用正则表达式进行删除操作
8、替换文本
sed 's/night/NIGHT/' 将文本中每一行的第一个night替换为NIGHT
sed 's/night/NIGHT/g' 将文本中的所有night替换为NIGHT(g意为匹配所有文本)
sed 's/splendid/SPLENDID/w sed.out' 将文本中的splendid替换为SPLENDID,并且输出至文件sed.out中(w选项后接一个文件,意为将结果写入至这个文件)
9、插入字符串
sed -n 's/played/from Hockering/ &/p' 在played之前插入from Hockering
10、将sed结果写入文件命令
sed '1,2 w filedt' 将输入文本的1、2行写入至filedt中(w通知sed将文本写入至目标文件中)
sed '/neave/ w dht' 将输入文本中匹配到neave的结果写入至dht中
11、从文本中读取文本
sed '/company/r sedex.txt' quote.txt 将sedex.txt中的内容插入至quote.txt文件中匹配行/company/后
12、匹配后退出
sed '/.a.*/q' 匹配到文本中的规则之后退出
13、sed命令可以结合多个操作指令,每个指令之间通过" ; "分割
sed 's/^.//;s/.$//' file 同时移除每一行的第一个字符和最后一个字符
14 、删除每一行的前n个字符
sed -r 's/.{n}//' file
15 、删除每一行的后n个字符
sed -r 's/.{n}$//' file
16 、除了每一行的前n个字符外,剩下的都要删除
sed -r 's/(.{3}).*/\1/' file
命令解释:.{ 3 } 匹配每一行的头3个字符,并且用( ) 进行分组,.*表示匹配任意多个字符。在替换位通过\ 1 表示保留第一个分组的内容。
17 、删除每一行所有字符且保留结尾的n个字符
sed -r 's/.*(.{n})/\1/' file
18 、删除每一行匹配到的第n个字符
sed 's/u//2' file
命令解释:sed默认只会处理匹配到的第一个字符,可以指定其处理匹配到的第n个字符。如上命令将会把每一行匹配到的第二个u删除。
19 、删除每一行中出现的所有数字
sed 's/[0-9]//g' file
20 、删除除了小写字符之外的其他所有字符
sed 's/[^a-z]//g' file
21 、追加/插入文本
追加:sed 's/li/&wei/g' file
命令解释:在file中的每一行的li之后追加wei
sed 's/$/wei/g' file
命令解释:在file中的每一行末尾追加wei
插入:sed 's/li/wei&/g' file
命令解释:在file中的每一行的li之前插入wei
sed 's/^/wei/g' file
命令解释:在file中的每一行的开头插入wei
四、find命令
1 、格式:find pathname -opentions [ -exec -print -ok]
解释:-print 将匹配结果打印到交互界面
-exec 对匹配的文件执行该参数所给出的shell命令。命令格式:'command {} \;'
-ok 和-exec作用相同,只不过是以一种更加安全的模式来执行该参数所给出的shell命令
2 、find命令选项
-name 按照文件名查找文件
-perm 按照文件权限来查找文件
-prune 使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用了-depth选项,那么-prune选项将被find命令忽略
-user 按照文件属主来查找文件
-group 按照文件所属的组来查找文件
-mtime -n +n 按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。
-nogroup 查找无有效属组的文件,即该文件所属的组在/etc/groups中不存在
-nouser 查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在
-newer file1 ! file2 查找更改时间比文件file1新但是比file2旧的文件
-type 查找某一类型的文件。
b 块设备文件
d 目录
c 字符设备文件
p 管道文件
l 符号链接文件
f 普通文件
-size n[ c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计
-depth 查找文件时,首先查找当前目录中的文件,然后在其子目录中查找
-fstype 查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息
-mount 在查找文件时不跨越文件系统mount点
-follow 如果find命令遇到符号链接文件,就跟踪至链接所指向的文件
3 、使用name选项
find ~ -name "*.txt" -print
命令解释:在根目录$HOME 中查找文件名符合*.txt的文件,~代表$HOME 目录
find . -name "*.txt" -print
命令解释:在当前目录及子目录中查找所有的*.txt文件
4 、使用perm选项
find . -perm 755 -print
命令解释:在当前目录中查找文件权限为755的文件
5 、忽略某个目录
find . -path "需要忽略的目录" -prune -o -name "*.txt" -print
命令解释:在当前目录及其子目录下除了需要忽略的目录中查找后缀为txt的文件并打印到交互界面。-o意为or,以上指令顺序不能错
find . \ ( -path "需要忽略的目录1" -o -path "需要忽略的目录2" \ ) -a -prune -o -name "*.txt" -print
命令解释:在当前目录及其子目录下除了两个需要忽略的目录中查找后缀为txt的文件并打印到交互界面。-a意为and
find . \ ( -path "目录1" -o -path "目录2" \ ) -a -name "*.txt" -print
命令解释:在目录1和目录2及其子目录中查找后缀为txt的文件
6 、使用user和nouser选项
find . -user liwei -print
命令解释:在当前目录中查找属主为liwei的文件并打印到交互界面
find . -nouser -print
命令解释:在当前目录中查找属主账户已经被删除的文件
7 、使用group和nogroup选项
find . -group liwei -print
命令解释:在当前目录中查找liwei用户组的文件
find . -nogroup -print
命令解释:在当前目录中查找没有有效所属用户组的所有文件
8 、按照更改时间查找文件
find . -mtine -5 -print
命令解释:在当前目录下查找更改时间在5日以内的文件
find . -mtime +3 -print
命令解释:在当前目录下查找更改时间在3日以前的文件
9 、查找比某个文件新或旧的文件
find . -newer file1 ! -newer file2
10 、使用type选项
find . -type d -print
命令解释:查找当前目录下所有的目录
find . ! -type d -print
命令解释:查找当前目录下除了目录以外的所有类型的文件
find . -type l -print
命令解释:查找当前目录下所有的符号链接文件
11 、使用size选项
find . -size +100c -print
命令解释:在当前目录下查找文件长度大于100字节的文件
find . -size 100c -print
命令解释:在当前目录下查找文件长度恰好为100字节的文件
find . -size -10 -print
命令解释:在当前目录下查找长度超过10块的文件(一块等于512字节)
12 、使用depth选项
find . -name "匹配文件" -depth -print
命令解释:先在当前目录下进行查找,再进入子目录进行查找
13 、使用mount选项
find . -name "匹配文件" -mount -print
命令解释:在当前的文件系统中查找文件,不进入其他文件系统
五、流程控制
1 、if语句
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi
2 、case语句
case $变量名 in
"值1" )
如果变量的值等于值1,则执行程序1
; ;
"值2" )
程序2
; ;
*)
如果变量的值与以上值都不匹配,则执行此程序
; ;
esac
3 、for循环 ( 遍历文本时一个一个的读取打印)
3.1 、方式一:
for (( 初始值; 循环条件; 变量变化))
do
程序
done
3.2 、方式二:
for 变量 in 值1 值2 值3.. .
do
程序
done
4 、while循环 ( 遍历文本的时候一行一行的打印,所见即所得)
while [ 条件判断式 ]
do
程序
done
5 、until循环
until 条件
do
程序1
程序2
.. .
done
六、后台执行命令
1 、crontab
1.1 、格式:crontab [ -u user] -e -l -r
1.2 、参数
-u 用户名。如果使用自己的名字登录,就不用使用-u选项,因为在执行crontab命令时,该命令能够知道当前的用户
-e 编辑crontab文件
-l 列出crontab文件中的内容
-r 删除crontab文件
1.3 、crontab文件域
第一列:分钟1~59
第二列:小时1~23( 0 表示子夜)
第三列:日1~31
第四列:月1~12
第五列:星期0~6( 0 表示星期天)
第六列:要运行的命令
1.4 、提交方式
crontab 提交的文件名
2 、at
at命令允许用户向cron守护进程提交作业,使其在稍后的时间运行。
1 、格式:at [ -f 脚本] [ -m -l -r] [ time] [ date]
2 、参数
-f 指明需要提交的脚本
-l 列出当前所有等待运行的作业
-r 清除作业
-m 作业完成后给用户发邮件
time 时间格式非常灵活,可以使H、HH.HHMM、HH:MM或H:M
date 日期格式可以使月份数或日期数,而且at命令还能识别today、tomorrow这样的词。
3 、提交命令或脚本
3.1 、提交若干行的命令,可以在at命令后面跟上日期时间并回车,然后这就进入了at命令提示符,只需逐条输入相应的命令,最后键入ctrl+d退出。
3.2 、提交一个shell脚本,使用-f选项
4 、清除一个作业
atrm job no 或 at -r job no
job no 为作业标识,先用at -l列出所有作业,第一列为作业标识
3 、&
可以使用& 命令将作业放到后台执行,但是退出时该进程会被终止。而nohup会使后台进程能够在退出后继续运行。
格式:命令 &
命令 > 输出文件 2 >&1 & 将标准输出以及错误输出都重定向到输出文件中
4 、nohup
格式:nohup 命令 &
七、文件的分割与合并
1 、split用法
1.1 、格式
split 参数 输入文件 输出文件
1.2 、参数
-a 生成长度为n的后缀(默认值为2)
-b 按大小切割文件
-C 按字节切割文件
-d 使用数字后缀替代字母
-e 不生成带有'-n' 的空输出文件
-l 按行切割文件
-n 按生成文件个数切割
-u 打印日志
1.3 、按文件大小切分,并指定后缀
split -b 1k input_file -d -a 1 date_
结果:
date_0
date_1
1.4 、按字节切分
split -C 200 input_file -d -a 1 date_
1.5 、按行数切割,并重命名文件
split -l 50 input_file -d -a 1 date_
1.6 、按输出文件个数切割
split -n 5 input_file -d -a 2 date_
结果:
date_00
date_01
date_02
1.7 、批量为文件添加后缀
ls | grep date_ | xargs -n1 -i{ } mv { } { } .txt
2 、sort用法
2.1 、格式
sort [ -bcdfimMnr] [ -o 输出文件] [ -t 间隔符] [ 输入文件] [ -k 按指定的列进行排序]
2.2 、参数
-b 忽略每行前面开始出的空格字符
-c 检查文件是否已经按照顺序排序
-d 排序时,处理英文字母、数字及空格字符,忽略其他字符
-f 排序时,将小写字母视为大写字母
-i 排序时,除了040至176之间的ASCLL字符外,忽略其他字符
-m 将几个排序好的文件进行合并
-M 将前面3个字母依照月份的缩写进行排序
-n 依照数值大小进行排序
-u 意味着是唯一的( unique) ,输出的结果是去重了的
-o 输出文件,将排序后的结果写入指定的文件
-r 以相反的顺序进行排序
-t 分隔符,指定排序时多用的栏位分隔符
+起始栏位-结束栏位,以指定的栏位来排序,范围由起始栏到结束栏位的前一栏位
-k 起始列,终止列,按指定的列进行排序
3 、uniq用法
用于从一个文本文件中取出或禁止重复行(重复行必须相邻,可以使用sort命令使不相邻的重复行排序后相邻)。
1 、格式:uniq [ 参数] 输入文件 输出文件
2 、参数
-u 只显示不重复行
-d 只显示有重复数据行,每种重复行只显示其中一行
-c 打印每一重复行出现次数
-f 前n个域被忽略。一些系统不识别-f选项,这时替代使用-n
4 、join用法
用来将来自两个分类文本文件的行连接在一起
1 、格式:join [ 参数] 输入文件1 输入文件2
2 、参数
-an n为数字,用于连接时从文件n中显示不匹配行。类似于左外连接或右外连接
-o n.m n为文件号,m为域号。1.3表示只显示文件1第三域。每个n.m之间必须使用',' 进行分隔
-j n m n为文件号,m为域号。使用其他域做连接域
-t 域分隔符。用来设置非空格或tab键的域分隔符。例如,指定冒号做域分隔符'-t:'
5 、cut用法
用来从标准输入或文本文件中剪切列或域。剪切文本可以将之粘贴到一个文本文件。
1 、格式:cut [ 参数] 文件1 文件2
2 、参数
-c list 指定剪切字符数
-f filed 指定剪切域数
-d 指定域空格和tab键不同的域分隔符
-c 指定剪切范围
如:-c1,5-7 剪切第一个字符,然后是五到七个字符
-c1-50 剪切前五十个字符
-f1,5 剪切第一域,第五域
-f1,10-12 剪切第一域,第五域
6 、paste用法
按行将不同文本信息放在一起
1 、格式:paste [ 参数] -文件1 文件2
2 、参数
-d 指定不同于空格或tab键的域分隔符。如-d@
-s 将每个文件合并成行而不是按行粘贴
- 指定每一行输出几列,有几个"-" 就输出几列。
如:ls | paste -d":" - - 每一行输出两列,使用":" 进行分割
八、shell函数
1 、格式:
函数名( ) {
命令1
命令2
……
}
2 、向函数中传递参数
当向函数中传入参数后,在调用这个函数时,必须在其函数名之后再次传入参数
如sum $1 $2 .. .
3 、从调用函数中返回
使用return关键字,只能返回0~255之间的数,如果返回值大于255,将返回他与255相除的余数
4 、删除shell函数
使用unset关键字,unset 函数名
九、条件测试
1 、test测试文件状态
1.1 、格式:test condition或[ condition ]
1.2 、参数
-d 目录
-f 普通文件
-L 符号连接
-r 可读
-s 文件长度大于0,非空
-w 可写
-u 文件是否有suid位
-x 可执行
-e 文件是否存在
-a 逻辑与,操作符两边均为真,结果为真,否则为假
-o 逻辑或,操作符两边至少一边为真,否则为假
! 逻辑否,条件为假,结果为真
2 、test字符串测试
2.1 、格式:
test "string"
test string_operator "string"
test "string" string_operator "string"
[ string_operator string]
[ string string_operator]
2.2 、这里string_operator可为:
= 两个字符串相等
!= 两个字符串不等
-z 空串
-n 非空串
3 、数值测试
3.1 、格式:
"number" numeric_operator "number"
[ "number" numeric_operator "number" ]
3.2 、numeric_operator可为:
-eq 数值相等
-ne 数值不相等
-gt 大于
-lt 小于
-le 小于等于
-ge 大于等于
4 、expr
expr命令一般用于整数值,但也可以用于字符串
1 、格式:expr argument operator argument
expr 10 + 10
expr 30 / 3
expr 30 \ * 3 ( 使用乘号时,必须用反斜线屏蔽其特定含义)
2 、增量计数
loop = 0
loop = ` expr $loop + 1 `
命令解释:首先初始化loop为0,然后将使用expr将loop放入循环中
3 、数值测试
value = 12
expr $value + 10 > /dev/null 2 >1 &
echo $?
命令解释:对一个变量进行数值运算,若是$? 返回0或是expr返回1,则表明这个变量为数值。特别注意,expr与系统返回状态不同,返回1为正确。
4 、模式匹配
使用冒号计算字符串中字符数
value = accounts.doc
expr $value : '.*' 结果为12
使用字符串匹配操作,抽取字符串
expr $value : '\(.*\).doc' 结果为accounts
十、命令执行顺序
1 、使用&&
使用形式
命令1 && 命令2 命令1执行成功才会执行命令2
2 、使用||
使用形式
命令1 || 命令2 命令1执行失败才会执行命令2
3 、使用( ) 和{ } 将命令结合在一起
3.1 、在当前shell中执行一组命令
( 命令1; 命令2; ……)
3.2 、在子shell中执行一组命令
{ 命令1; 命令2; ……} 只有在{ } 中所有命令的输出作为一个整体被重定向时,其中的命令才会被放到子shell中执行,否则在当前shell中执行
十一、环境和shell变量
1 、本地变量
1.1 、本地变量在用户现在的shell生命期的脚本中使用,这个值只在用户当前shell生命期有意义,如果在shell中启动另一个进程或退出,此值将无效。
1.2 、定义格式
variable-name= value 或 ${variable-name=value}
1.3 、显示变量
echo $变量名
1.4 、清除变量
unset 变量名
1.5 、显示所有本地shell变量
set
1.6 、结合变量值
echo ${变量1} ${变量2} ……
1.7 、测试变量是否已经设置
var = value 设置实际值到var
var+value 如果设置了var,则重设其值
var:?value 如果未设置var,显示未定义用户错误信息
var?value 如果未设置var,显示系统错误信息
var:= value 如果未设置var,设置其值
var:-value 同上,但是如果取值并不设置到var,可以被替换
1.8 、使用变量来保存系统命令参数
使用变量保存文件拷贝的文件名信息
SOURCE = "/etc/passwd"
DEST = "/tmp/passed.bak"
cp ${SOURCE} ${DEST}
1.9 、设置只读变量
readonly 变量名
2 、环境变量
2.1 、设置环境变量
variable = value; export variable
2.2 、显示环境变量
echo $变量名
env查看所有的环境变量
2.3 、清除环境变量
unset 变量名
3 、局部变量
local name
在函数中使用局部变量,保证了变量只局限在该函数中
fun ( ) {
local name = 10
}
name = 5
echo name
最终的输出结果为5
4 、数组变量
4.1 、创建数组,不同元素之间以空间隔
arr = ( 1 2 3 )
4.2 、获取数组元素
获取第n-1个元素:echo ${a[ n] }
获取全部元素:echo ${a[ *] } 或echo ${a[ @] }
十二、RPM
1 、查询命令
1.1 、基本语法
rpm -qa 查询所安装的所有rpm软件包
1.2 、经验技巧
由于软件包较多,一般都会采取过滤rpm -qa | grep rpm软件包
2 、卸载命令
2.1 、基本语法
rpm -e rpm软件包
rpm -e --nodeps 软件包
2.2 、选项说明
-e 卸载软件包
--nodeps 卸载软件时,不检查依赖。这样的话,那些使用该软件包的软件在此之后就不能正常工作了
3 、安装命令
3.1 、基本语法
rpm -ivh rpm软件包
3.2 、选项说明
-i install,安装
-v --verbose,显示详细信息
-h --hash,进度条
--nodeps 安装前不检查依赖
十三、YUM
1 、基本语法
yum [ 选项] [ 参数]
2 、选项说明
-y 对所有提问都回答"yes"
3 、参数说明
install 安装rpm软件包
update 更新rpm软件包
check-update 检查是否有可用的更新rpm软件包
remove 删除指定的rpm软件包
list 显示软件包信息
clean 清理yum过期的缓存
deplist 显示yum软件包的所有依赖关系
十四、tar
1 、基本语法
tar [ 选项] XXX.tar.gz 将要打包的内容
2 、选项说明
-c 产生.tar打包文件
-v 显示详细信息
-f 指定压缩后的文件名
-z 打包同时压缩
-x 解包.tar文件
-C 解压到指定目录
3 、压缩
tar -zcvf 压缩后文件名.tar.gz 要打包的内容
4 、解压
tar -zxvf 要解压的内容 -C 想要解压到的目录
十五、shell的输入与输出
1 、echo
1.1 、一般形式
echo [ 参数] string
1.2 、参数
-n 使用-n选项来禁止echo命令输出后的换行
echo -n "What's your name:"
-e 使用-e选项使转义字符生效
echo -e "\007 your home directory is $HOME "
2 、read
可以使用read语句从键盘或文件的某一行文本读入信息,并将其赋给一个变量。如果只指定了一个变量,那么read将会把所有的输入赋给该变量,直至遇到第一个文件结束符或回车
2.1 、一般形式
read [ 参数] variable1 variable2 ……
注意:( 1 ) shell将空格作为变量之间的分隔符
( 2 ) 如果输入的文本域过长,shell将所有的超长部分赋予给最后一个变量
2.2 、参数
-a 后跟一个变量,这个变量会被认为时数组,然后给其赋值,默认空格为分隔符。读取时使用echo ${arr[ n] }
-d 后跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志
-p 后面跟提示信息,即在输入前打印提示信息
-e 在输入的时候可以使用命令补全功能
-n 后跟一个数字,定义输入文本的长度。输入字符长度达到之后自动退出
-r 屏蔽\ ,如果没有该选项,则\ 作为一个转义字符,有的话\ 就是个正常的字符
-s 安静模式,在输入字符时不在屏幕上显示,例如login时输入密码
-t 后面跟秒数,定义输入字符的等待时间
3 、cat
用来显示文件内容,创建文件,显示控制字符
3.1 、一般形式
cat [ 参数] 文件1 文件2 ……
3.2 、参数
-v 显示控制字符
-n 显示文件行号
-e 在文件中的行尾及两端之间的间隙之间显示$
-T 将tab字符显示为^|
-s 当遇到有连续两行以上的空白行,就替换为一行空白行
3.3 、一次显示多个文件,多个文件之间使用空格进行分隔。如cat file1 file2 ……
4 、管道
通过管道把一个命令的输出传递给另一个命令作为输入
一般形式
命令1 | 命令2
5 、tee
把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中。
5.1 、一般形式:
tee [ 参数] files
5.2 、参数
-a --append 附加到既有文件的后面,而非覆盖它
-i --ignore-interrupts 忽略中断信号
十六、
shell定义变量及类型
declare 和 typeset命令是等价的
参数
-r 将变量设置为只读变量
-i 将变量设置为整数
-a 将变量设置为数组
-x 将变量设置为环境变量
十七、xargs
管道符与xargs的区别:管道符是将上一层的标准输出作为下一层的标准输入,而xargs是直接将上一层的标准输出作为下一层的参数
1 、格式
命令1 | xargs [ 参数] 命令2
2 、参数
-a file 从文件中读入作为标准输入
-e/E flag flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止
-p 当每次执行一个参数的时候询问一次用户是否执行后面的命令,y执行,n不执行
-n num 后面加次数,表示结果在输出的时候一行输出n个
-t 表示先打印命令,然后再执行
-i/-I 将xargs的每项名称,一般是一行一行赋值给{ } ,可以用{ } 代替
-r 当xargs的输入为空的时候就停止xargs,不用再去执行了
-s num 命令行的最大字符数,指的是xargs后面那个命令的最大命令行数字符数
-L num 从标准输入一次读取num行送给命令
-d 分隔符 默认的分隔符是回车,参数的分隔符是空格,这里修改的是xargs的分隔符
-x exit的意思,主要是配合-s使用
--max-procs xargs默认只用一个进程执行命令。如果命令要执行多次,必须等上一次执行完才能执行下一次。这个参数可以指定同时用多少个进程并行执行命令。--max-procs 2 表示同时最多使用两个进程,--max-procs 0 表示不限制进程数。
-0 表示用null当做分隔符
十八、系统参数
$? :返回上一条命令的执行结果,若是正确则返回0,不正确则返回其他数
$0 :返回文件名
$# :返回参数个数
$* :将输入参数视为一个整体,而不是多个个体
$@ :将输入参数作为同一个字符串中的多个独立的单词
$1 :输入的第一个参数
$n :输入的第n个参数
十九、标准输入、输出、错误
命令 1 > 文件:标准输出,将命令正确的输出结果输入至文件中
命令 2 > 文件:标准错误,将命令错误的输出结果输入至文件中
命令 &> 文件:命令生成的所有结果都输入至文件中,相较于标准输出,bash shell会自动赋予错误消息更高的优先级
echo "输出信息" > &2 :有意将输出信息转化为标准错误信息
exec 0 < 文件:从文件中读取数据
echo 3 >& -:要关闭文件描述符,将他重定向到特殊符号& -
命令 > /dev/null:将命令的输出结果输出至null中,类似于垃圾桶,输出至这个文件中的数据都会被丢掉
二十、Ctrl+z、Ctrl+c
Ctrl+z:中止程序
Ctrl+c:终止程序
jobs -l:查看中止的程序
jobs -n:只列出上次shell发出通知后改变了状态的作业
jobs -p:只列出作业的PID
jobs -r:只列出运行中的作业
jobs -s:只列出已停止的作业
fg 作业号:前台继续执行作业
bg 作业号:后台继续执行作业
二十一、库函数
1 、创建库文件
和普通文件一样,在文件中编写函数,方便被别的文件引用
$ cat myfuncs
function addem {
echo $[ $1 + $2 ]
}
function multem {
echo $[ $1 * $2 ]
}
function divem {
if [ $2 -ne 0 ]
then
echo $[ $1 / $2 ]
else
echo -1
fi
}
2 、在别的脚本文件中引用库文件
使用库函数的关键在于source命令,source命令会在当前shell上下文中执行命令,source命令有个快捷的别名,称作点操作符。假定库文件和shell脚本位于同一目录,只需在shell脚本中添加
. ./库文件
例子:
. ./myfuncs
value1 = 10
value2 = 5
result1 = $( addem $value1 $value2)
result2 = $( multem $value1 $value2)
result3 = $( divem $value1 $value2)
echo "The result of adding them is: $result1 "
echo "The result of multiplying them is: $result2 "
echo "The result of dividing them is: $result3 "
$
二十二、算术运算
1 、使用printf
printf( "%.保留小数位个数f" ,参数)
eg:
printf( "%.3f" ,i/j)
解释:保留i除以j的3位小数结果
2 、使用bc
"scale=保留小数位;参数" | bc
eg:
echo "scale=2;a/b" | bc
解释:保留a除以b的2位小数结果
二十三、路径文件名操作
获取绝对路径
1 、格式( realpath方式)
realpath filename
eg:
realpath a.txt
2 、格式(readlink -f)
readlink -f filename
eg:
readlink -f a.txt
通过路径获取文件名
1 、格式(basename方式)
basename filename
eg:
basename a.txt