之前有一篇介绍最基本的linux系统日常使用命令,见《1.linux日常》
1. 重定向符号>, >> , >&, &>
COMMAND > file 命令的标准输出stdout的内容覆盖file中内容,若file不存在,则新建一个
COMMAND >> file 命令标准输出stdout的内容追加到file中,若file不存在,则新建一个
COMMAND >& file 或 COMMAND >& 1 cmd标准stdout/错误stderr输出一起追加到file或标准输出上,其中1代表标准输出描述符。注意,这里是标准输出和错误输出合并重定向
COMMAND &> file 和>&类似,但是后面只能跟文件名,不可跟描述符
2. env
打印当前所有环境变量
3.sed
3.1 s替换功能,语法:sed "[address]s/pattern/replacement/flags" file
sed "s/abc/ABC/g" file.txt address address缺省时,sed作用于全体file内容
sed "2s/^$head/head:$head/" file 在第二行找以字符串变量head开头的字符串,并在它前加上head:
sed '3,$s/$var$/tail:$var/' file 从第3行到最后所有内容中,匹配以字符串变量var结尾的字符串,并在字符串前面加tail:
sed '/name/s/ABC/abc/' file 在含有name的行匹配将ABC替换成abc
cat my.sh
/what/{
s/name/NAME/
s/your/her
}
sed -f my.sh file 通过-f引入匹配脚本,my.sh表示匹配what所在行,替换name和your
3.2 d删除功能,语法:sed '[address]d' file
sed '3d' file 删除第3行
sed '3,7d' file 删除第3到第7行
sed '3,$' file 从第3行到结尾全删除
sed '/name/d' 删除所有含name的行
3.3 a追加(在目标后一行)和i插入(在目标前一行)新内容,语法:sed '[address]i(或a) content' file
sed '3i hello' file 在第3行之前插入新的一行,内容是hello
sed '5a good' file 在第5行之后追加新的一行,内容是good
3.4 c替换整行,调法:sed '[address]c content' file
sed '5c Good morning' file 将第5行换成Good morning
3.5 y映射替换,语法:sed '[address]y/inchars/outchars/' file
inchars和outchars必须字符数相等,否则报错
inchars和outchars一一映射,匹配到inchars中第几个字符,就会替换outchars中第几个字符
echo "hello world" | sed 'y/hwl/HWL/' 输出:HeLLo WorLd
3.6 p显示匹配项,语法:sed '[address]/p' file
p大部分要和-n选项配合使用,没有-n会打印其它不匹配的内容
sed -n '/what/p' file 显示所有匹配what的行
3.7 w写入,语法:sed '[address]w filename' file
将匹配的项写到另一个文件中
sed '1,7w other.txt' file 将file中1到7行写入other.txt文件中
3.8 r读取,语法:sed '[address]r filename' file
读取filename中的内容插到file的第adress行后面
sed '4r tar.txt' file
3.9 选项
-e 将后跟的命令加到sed命令中
-f 将后面的文件脚本的命令加到sed命令中,例如3.1最后一个示例
-n 屏蔽默认输出,配合p只输出特定内容,如3.6
-i 默认是不修改原文件的,本选项直接修改原文件
4. find
4.1 语法:find [范围] [类型] 查找的数据
find /etc/ -name "pas*"
4.2 -name 按文件的名称来查找,可使用通配符*或?
find /etc/ -name "[A-Z]+" 在/etc中找以大写字母开头的文件
-iname 表示不区分大小写
-inum 以inode号来查找
4.3 -size 按文件大小来查找
find /etc/ -size +1G 在/etc下查找大于1G的文件
find /etc/ -size -1G 在/etc下查找小于1G的文件
find /etc/ -size 1G 在/etc下查找等于1G的文件
4.4 -user 按用户名来查找 -group按组名来查找
find /etc/ -user ysz -group YSZ 在/etc下查找用户名为ysz同时组名为YSZ的文件
find /home -user ysz 在/home下找用户名为root的文件
4.5 -type 按文件类型查找,f:普通文件;d:目录;b:块设备文件(硬盘,U盘等);c:字符设备文件(IO传输过程中以字符为单位传输的设备,如键盘,显示屏,鼠标等);l:链接文件
find /dev/ -type b 查找/dev下所有设备文件
find /etc -type l 查找/etc/下所有链接文件
4.6 -perm 按权限查找
find ./ -perm 755 查找本目录内所有权限是755的文件
find ./ -perm -644 查找本目录内文件权限至少是644的文件
4.7 -m[time,min] 按修改/创建时间查找
find ./ -mtime +5 -type f 查找修改(创建)时间超过5天的且文件类型是普通文件的文件
find ./ -mmin -10 查找十分钟内修改过的文件
4.7 -maxdepth 指定深度
find /home -user ysz -maxdepth 2 在/home中查找用户是ysz的文件,最大查找深度为2
4.8 多型 -a(并且),-o(或者),-!(取反)
find /home -user ysz -a -size +10M 在/home下找用户为ysz的大于10M的文件
4.10 处理动作
-print 默认动作,即查找到的文件显示到终端
-delete 找到了文件后,执行删除动作
find ./ -perm -644 -delete 对本目录至少有644权限的所有文件执行删除操作
-exec COMMAND {} \; 对查到的每个文件执行COMMAND操作,注意{}和\;之间有空格
find ./ -name "tar*" -exec sed 's/good/Bad/' {} \; 替换所有tar开头的文件中good为Bad
find /log/ -mtime +5 -type f -exec rm {} \; 删除创建超过5天的log日志
5.awk
5.1 语法:awk [options] '[BEGIN]{COMMANDS} [pattern] {COMMANDS} [END]{COMMANDS}' file
原理和作用:处理文件文本,sed和awk都是读取文件一行一行的处理,不同的是,sed以整行为处理单位,而awk是把一行分为很多字段(连续的无分隔符(可指定)的字符组成的字符串)处理。
awk执行过程:
若存在BEGIN,则先执行BEGIN后面的{}指令,然后继续下一步;
从stdin或文件中读取一行文本,根据分隔符分隔成若干字段,将每个字段匹配pattern,若匹配得上pattern,则执行后面的{}指令,否则继续读下一行,直到读取完毕。
若存在END,则最后执行一次END后面的{}指令。
pattern后面的指令,只要有匹配都会被执行,而BEGIN和END后面的指令,最多只执行一次。
5.2 -F选项指定分隔符,指令print执行打印
默认分隔符是空格,若存在-F,则以它后面指定的字符为分隔符
awk -F ':' '{print $1 $3}' /etc/passwd 指定分隔符为:号,打印/etc/passwd中第1和第3字段
awk -F ':' '/ysz/{print $1 $3}' /etc/passwd [pattern]是/ysz/,即匹配含有ysz的一行,再打印第1和第3字段。
5.3 条件判断与项的算术运算综合
$1>$2 符合项1比项2大时,执行后面的命令
awk 'BEGIN{print "test score."} $2>$1{print $0} END{print "test over."}' tar.txt
'$1<=$2{print $0}' 打印项1小于或等于项2的行
'NR==5{print $0}' 打印第5行
'NR%2==0{print $0}' 打印偶数行
'{if($1>$2){print $0}else{print $3}}' 若项1大于项2打印整行,否则打印第3项
'{for(i=0;i<3;i++){print $0}}' 每一行重复打印3次
'{i=0;while(i<3){print $0;i++}}' 每一行重复打印3次
6. grep
这是一个使用正则表达式搜索文本的工具,语法:grep [options] "target" files
它也是一行一行的读,以行为单位进行匹配
6.1 files可以是多个文件,也可以是通配符指示的多文件
grep "ysz" file1.txt file2.txt
grep "ysz" file*.txt
grep "ysz" ./*
6.2 选项
grep -c "tar" myfile 只显示匹配项的行总数
grep -i "tar" myfile 不区分大小写搜索,默认情况下是区分大小写的
grep -n "tar" myfile 显示tar所在的行以及行号
grep -s "tar" myfile 不显示无匹配文本的错误信息
grep -E "^[a-z]+" myfile 以正则表达式搜索