338.tee命令。(管道命令)
(1)last | tee last.list
将last 显示的登录信息覆盖到last.list 中,并且输出到屏幕上。
(2)last | tee -a last.list
将last 显示的登录信息追加到last.list 中,并且输出到屏幕上。
(3)last | tee -a last.list | cut -d ‘ ’ -f 1
将last 显示的登录信息追加到last.list 中,并且输出到后面的cut 命令处进行处理。
339.删除和替换输出内容中的数据。
(1)last | tr [a-z] [A-Z]
将last 输出的登录信息小写字母全部转换成大写字母。
(2)last | tr -d ‘:’
将last 输出的登录信息中的 : 删除。
(3)cat /root/passwd.windows | tr -d ‘\r’ > /root/passwd.linux
将windows DOS格式文件中的断行符删除,windows文件和linux文件最大的不同就是windows文件中的断行符多了一个^M , \r 代表的就是这个^M
339.col命令(管道命令)
(1)col -x 将tab键转换成对等的空格键。
在使用 cat -A 打开一个文件的时候,会看到很多^I的符号,那个就是tab键。
cat /etc/man.config | col -x | cat -A |more
这个命令即使加了cat -A 也不会出现^I 了。
340.join命令
(1)join -t ‘:’ /etc/passwd /etc/shadow
将 /etc/passwd 和 /etc/shadow 中以:为分割的第一个字符相同的行连成一行。
默认是以一个字符为判断的。
(2)join -t ‘:’ -1 4 /ec/passwd -2 3 /etc/group
将/etc/passwd 中的以:为分割的第四个数据和/etc/group 中的以:为分割的第三个数据相同的行连在一起。
(3)需要注意的是,在使用join的时候,你所需要处理的文件应该要事先经过排序sort
341.paste 命令
(1)paste /etc/passwd /etc/shadow
将/etc/passwd 和 /ec/shadow 的数据行和行对应在一起。
(2)paste -d “:” /etc/passwd /etc/shadow
用:将两个文件的数据分隔开,默认是使用tab分割的。
(3)cat /etc/group | paste /etc/passwd /etc/shadow -
- 代表的是前面输出的数据
342.split 命令。
(1)split -b 300k /etc/termcap temcap
将/etc/termcap 分成300K一个的文件,
最后面的是生成文件的文件名前缀。
(2)ls -l / | split -l 10 - lsroot
将根下的目录信息 ,分成10行一个的文件 ,注意- 的添加。
343.find 中 perm 的用法。
(1)find / -perm -0644
-110100100 有的地方用1代表,没有的用0代表
找到每个1必须匹配的文件
意思就是匹配至少是这么多个权限。
(2)find / -perm +0644
找到其中的一个1被匹配就可以。
意思就是最多匹配是这么多个权限。
(3)find / -perm 0644
找到其中的权限正好是这个的。
350.grep 命令。
(1)grep -A 3 -B 3 ‘root’ /etc/passwd
在/etc/passwd 查找 root 字符串 ,并将目标行上面3行和下面3行打印出来。
(2)grep -n ‘[^[:lower:]oo]’ regular.express.txt
在文件中找到不是小写字母开头, 后面接了oo的行。
(3)grep -n ‘ooo*’ regular.express.txt
找到至少有两个o的行。
o*代表的是o出现了0次到多次的意思
(4)grep -n ‘o\{2\}’ regular.express.txt
找到o出现了2次的行。
因为{}是特殊字符,所以用\ 转义。
(5)grep -n ‘go\{2,5\}’ regular.express.txt
找到g后面出现了2次到5次o 的行。
(6)grep -n ‘go\{2,\}’ regular.express.txt
找到g后面出现了2次以上o的行。
(7)ls -l /etc/ | grep ‘^l’
找到/etc/下的链接文件。
(8)grep -n ‘[!<]’ regular_express.txt
想要找到 ! 和 < 的行。
或者
grep -n ‘!’ regular_express.txt
grep -n ‘<’ regular_express.txt
grep -n ‘!<’ regular_express.txt 是找不出来的。
grep ‘[abce]’ regular_express.txt
找出有abce任一一个字母的行。
358.sed命令。
(1)nl /etc/passwd | sed ‘3,$d’ 行号显示,用sed 将3到最后都删除。
(2)sed [n1,[n2]function] 文件
function 有下面的参数
a: 新增
c: 替换行
d:删除行
i : 插入行,目前的前一行
p: 打印
s: 替换字符
(3)sed -i 修改源文件,默认只是打印到屏幕上。
(4)nl /etc/passwd (为了显示行号) | sed ‘2a Drink tea or ........\
> drink beer ?’
这个范例的重点是我们新增的不只一行,可以新增好几行,但是每一行之间都必须要以反斜杠“\” 来进行新行的增加。
(5)nl /etc/passwd | sed -n ‘5-7p’ -n 和 -p 通常一起用。
(6)sed -n ‘s/$/\!/g’ regular_express.txt
sed 代表的是每一行最后一个字符,也就是换行符,用cat 是看不到的,用set显示的效果就是在每一行的后面加上一个!。
(7)sed -i ‘s/\.$/\!/g’ regular_express.txt
将以 . 为结尾的行中最后面的 . 替换成 ! 。
(8)用sed 的一些使用区别。表现-n p 的连用效果。
(9)sed -r ‘s/([a-Z]*)(^[a-Z0-9]*)([a-Z]*)/\3\2\1/g’ test.txt
将test.txt 中内容 zhige test
换成 test zhige
(10)sed ‘1i 1 \n 2’ test.txt
(11)sed ‘1r b.txt’ test.txt
在test.txt 文件中的第一行下面读入文件b.txt的内容。
(12)sed -n ‘/bash$/!p’ /etc/passwd
取出结尾不是bash 的行。
!表示取反。
(13)sed ‘1h;2H;1,2d;$G’ test.txt
将1行和2行的内容删除,并将1行和2行的内容复制到文本的末尾。
(14)sed -e ‘4d’ -e ‘6c no six line’ > passwd.new
当有多个动作的时候,用-e 分割动作
361.egrep 命令。
(1)egrep -v ‘^$|^#’ regular_express.txt
两个条件同时满足,egrep 使用的是扩展正则。
相当于
grep -v ‘^$’ regular_express.txt | grep -v ‘^#’
(2)扩展正则的一些表示方法。
+ 一个以上的前一个字符
egrep -n ‘go+d’ regular_express.txt (-n 显示源文件行号)
? 一个或者是0个前一个字符
egrep -n ‘go?d’ regular_express.txt
| 表示或者,两个条件中有一个满足就可以。
egrep -n ‘gd|good|dog’ regular_express.txt
() 表示部分或者的情况,规定肯定的部分。
egrep -n ‘g(la|oo)d’ regular_express.txt
()+ 表示前面括号中的内容,出现了一次以上
echo “AxyzxyzxyzxyzC ” egrep -n ‘A(xyz)+C’
362.printf 命令。
(1)printf 命令的用处在于将输出的结果做的更加好看一点。
(2)printf 打印格式 实际内容
(3)printf ‘%s\t %s\t %s\t %s\t %s\t \n ’ $(cat printf.txt)
printf ‘%s\t %s\t %s\t %s\t %s\t \n ’ zhige zhige zhige zhige zhige
\t 是增加一个tab键的作用,%s代表匹配字符。\n 代表另起一行。
这就是$(cat printf.txt )的作用。意思就是在后面加上几个字符串,好让printf 能够根据这些字符串排版。
(4)printf ‘%10s %5i %5i %5i %8.2f \n’ $(cat printf.txt | grep -v Name )
%10s 代表的是10个字符
%5i 代表的是 5个整数
%8.2f 代表的是小数,那个8代表的是整数的部分位数,2代表的是小数的部分位数
(5)printf ‘\x45’ 列出十六进制数值 45所代表的字符。
364.awk命令。
(1)last -n 5 (last 查看登录信息,-n 5 显示前五行) | awk ‘{print $1 “\t” $3 }’
取出第一列和第三列,中间的 \t 就是tab键的意思,\t必须用双引号引起来
(2)awk ‘{print $0}’ /etc/passwd
$0 是一整行的意思,这个命令默认就是输出全部的内容。
(3)NF 每一行($0)拥有的字段总数,默认以空格分开之后的数量,不是字符数。
NR 目前awk 所处理的是第几行的数据
FS 目前的分割字符,默认是空格键
(4)记得非变量的文字部分,包括printf 提到的格式中,都需要使用双引号来定义出来,
因为单引号已经是awk的固定用法了。
#printf ‘%s\t %s\t “zhige ” %s\t \n’ zhige zhige zhige
zhige zhige zhige zhige 第三个zhige 后面没有tab
#last -n 5 | awk ‘{print $1 “\t lines:” NR “\t columes: ” NF}’
注意””中的是\t和 非变量的字符。
(5)cat /etc/passwd | awk ‘{FS=”:”} $3 < 10 {print $1 “\t” $3}’
会发现第一行没有正确显示出来。这个是因为我们在读入第一行的时候,那些变量$1,$2 默认还是以空格键为分割的,所以虽然我们定义了FS=”:” 了,但是却仅能在第二行后才能开始生效,我们可以预先设置awk的变量啊,利用BEGIN这个关键字。
cat /etc/passwd | awk ‘BEGIN{FS=”:”} $3 < 10 {print $1 “\t” $3} ’
(6)cat pay.txt| awk ‘NR==1{printf “%10s %10s %10s %10s %10s\n”,$1,$2,$3,$4,”Total”} NR>=2 {total = $1 + $2 + $3;printf “%10s %10d %10d %10d %10.2f\n”, $1, $2, $3, $4, total}’
需要注意的是:在awk中$1 和 $2 之间必须有“,”,在{}之中,有两个命令的时候,必须用 ; 分割开。其中,total = $2 + $3 + $4 是在定义变量。
(7)所有的awk 的动作,即在{}内的动作,如果有需要多个命令辅助时,可利用分号“;”间隔,或者直接以【Enter】按键来隔开每个命令。
逻辑运算当中,如果是“等于”的情况,则务必使用两个等号“==”
格式化输出时(printf),务必加上\n,才能进行分行。
与bash、shell的变量不同,在awk 中,变量可以直接使用,不需要加上$符号。
(8)awk ‘NR==1{print }’ /etc/passwd
awk ‘{if(NR==1)print}’ /etc/passwd
判断条件的位置一定要是在{}之中。
(9)awk -F”[: ]” ’{print $1}’ /etc/passwd 将:和 空格作为分隔符。在外边能够同时定义两个。
(10)awk ‘{print FNR}’ /etc/passwd /etc/shadow
分别显示两个文件的行号,都从1开始
awk ‘{print NR}’ /etc/passwd /etc/shadow
累计两个文件的行号,从上一个文件的结束开始
(11)awk -v i=$USER ‘{print i}’ 如果定义的变量的值是环境变量,那么只能在’’外面定义,不可以在{}里面定义。
相当于
awk ‘print ENVIRON[“USER”]’
awk -v 定义变量
ENVIRON[“”] 引用环境变量
awk ‘{print FILENAME}’ /etc/passwd
打印出文件名,有多少行打印出多少行。
(12)输出用/bin/bash作为解释器的用户的个数。
awk -F”[:]” ‘BEGIN{i=0} $7==”/bin/bash”{i++}END{print i}’ /etc/passwd
(13)awk -F: ‘BEGIN{print “USER\tUID\tHOME”} {print $1”\t”$3”\t”$6 } END{print “总行数是” NR}’
END之后的命令在执行完最后一行之后,再执行。
(14)在awk 上用正则表达式(默认打印出来)
awk ‘/^(127|192)/’ /etc/hosts
相当于
awk ‘/^127/||/^192/’ /etc/hosts
在/etc/hosts文件中找到以127或者192开头的行。
(15)匹配查找
awk -F: ‘$7~/bash/{print $1 $7}’ /etc/passwd
(16)逻辑比较
awk -F: ‘$3>=0&&$3<5 {print $1” ”$3}’ /etc/passwd
(17)awk -F:‘BEGIN{i=o} {i=i+NF} END{print i}’ /etc/passwd
相当于
awk -F: ‘{i=i+NF}END{print i}’ /etc/passwd 当没有变量没有被定义的时候,默认会取0
统计/etc/passwd 文件中的总列数。
(18)free | awk ‘$1~”-”{if($4<=500000)print $4}’
自己执行看看吧,注意语法就行了。
(19)awk 的if 条件判断语句,必须用在{}里边。
if(条件){指令}
if(条件){指令}else{指令}
if(条件){指令}elif{指令}else{指令}
awk -F: ‘{if($3<500){i++}else{j++}}END{print i “ ”j }’ /etc/passwd
if 的条件判断语句,加上else。
(20)awk的while条件
while(条件){指令}
do{指令}while(条件)
awk -F”[:/]” ‘i=1{while(i<=NF){if($i~/root/){j++};i++}END{print j}’ /etc/passwd
(21)awk的for用法。
awk -F: ‘{for(i=1;i<=5;i++){print $1}}’ /etc/passwd
每一行的第一列都被打印5遍。
(22)用awk查看web的访问日志,分别统计每个客户端IP访问的次数。
awk ‘{ip[$1]++} END{for ( i in ip){print i , ip[i]}}’ /var/log/httpd/access.log
(23)ls -l test.txt | sed ‘s/^.//’ | awk ‘BEGIN{FS=’’} {print $1$2$3}’
会取出test.txt 文件的权限。
在这个命令中,awk的默认分隔符为空格,FS=’’,将分隔符变成空,也就一个字符就是以列。
366.diff 文件比较工具、
(1)diff就是用在比较两个文件之间的区别的,并且是以行为单位来比较的!一般是用在ASCII纯文本文件的比较上,由于是以行为比较的单位,因此diff通常是用在同一文件(或软件)的新旧版本区别上。
(2)diff [-bBi] from-file to-file
to-file 是作为修改后的文件的
-b : 忽略一行当中仅有多个空白的区别(例如:about me 和 about me)
-B : 忽略空白行的区别
-i : 忽略大小写的不同
(3)diff passwd.old passwd.new
显示的信息解释
4d3 左边的第四行被删除了,基准是文件的第三行,基准的意思就是说目前两个文件的内容还相等到哪里
6c5 左边的第六行被替换成了第五行。
(4)diff /etc/rc3.d /etc/rc5.d
比较两个目录的不同
(5)diff -Naur passwd.old passwd.new > passwd.patch
制作补丁文件,将新文件中的改动放到passwd.patch 中
368.patch 更新文件用到diff的生成的文件
(1)patch -p0 < passwd.patch 在新旧文件的目录中,-p0的意思就是文件在同一
个目录中,不用删减目录层数的意思。如果是记录
目录之间的差别的话,就必须要指定这个值,个人
理解就是,目录中有目录中有目录,所以要指定恢
复那个层级的目录
将刚才制作出来的patch file 用来更新旧版数据。
(2)patch -R -p0 < passwd.patch
回复旧文件的内容。
367.cmp 文件比较命令。
(1)cmp passwd.old passwd.new
这个cmp 也可以用来比较二进制文件。
370.grep -l
(1)grep ‘\*’ $(find /etc/ -type f )
在/etc/下的文件中带有*的行的内容,会显示文件名和匹配文件内容
grep -l ‘\*’ $(find /etc/ -type f )
只显示有匹配的文件名
(2)find / -type f | xargs -n 10 grep ‘\*’
用find 找到结果,交由xargs 用grep 处理 ,-n 10 每十个处理一次。
find / -type f | xargs -n 10 grep -l ‘\*’
用find 找到结果,交由xargs 用grep 处理,只会显示文件名。
378.date命令的特殊用法。
(1)date --date=’1 days ago’ +%s
(2)date --date=’20170101’ +%s
(3)date --date=’2017-01-01’ +%s
(4)date --date=’2017/01/01’ +%s
380.test 命令。
(1)和用在脚本中的if [] 中的判断条件类似。
(2)test -e /dmtsai
查看/dmtsai 是否存在,根据返回值$?得知/dmtsai 是不是空的
(3)test -s test.txt
查看文件test.txt 是不是空文件。
(4)test file1 -nt file2
查看file1 是否比file2 新
(5)test file1 -ot file2
查看file1 是否比file2 旧
也是用$?判断的。
(5)test -e /dmtsai -a -e test.txt
两个条件同时成立。
test -e /dmtsai -o -e test.txt
两个条件成立一个即可
test ! -x test.txt
判断test.txt 是不是不具有x权限。