1.linux系统中的三种I/O设备所代表的编号分别是:标准输⼊(STDIN),⽂件描述符为0,默认从键盘获取输⼊;标准输出(STDOUT),⽂件描述符为1,默认输出到显⽰屏;标准错误(STDERR),⽂件描述符为2,默认输出到显⽰屏。I/O重定向就是为了改变默认输入、输出的位置: >:表示标准输出覆盖重定向;>>:表示标准输出追加重定向;内部机制是按回车才开始发生重定向;
2>:表示错误输出覆盖重定向;2>>:表示错误输出追加重定向;
&>:表示合并标准输出和错误输出覆盖重定向,老的版本不支持,老版本支持2>&1(标准错误也当成标准输出);
&>>:表示合并标准输出和错误输出追加重定向;
可以把&理解成也;例如:下列的哪项输出结果不同:
cat /etc/issue /etc/xxx > /data/all.log 2>&1,
cat /etc/issue /etc/xxx 2> /data/all.log 1>&2,
cat /etc/issue /etc/xxx 2>&1 > /data/all.log,这个不同,到2&1这步时,会在屏幕上输出标准错误,而把标准输出输入到文件里,加个小括号执行结果就一样了,如下
(cat /etc/issue /etc/xxx 2>&1 ) > /data/all.log,
cat /etc/issue /etc/xxx &> /data/all.log,
<:输入重定向;cat>这叫单行重定向,还可以多行,
<<:多行输入;“<<终止词”命令从键盘把多行重导向给STDIN,直到 终止词 位置的所有文本都发送给STDIN,应用场景:可以写配置文件,用<<开始,一般行首用EOF(end of file),其实其它包括数字也可以,只要和结尾一样就行,要注意的是不管前面或后边都不能有空格,有的话认为没结束,有时被称为就地文本(here documents),
【注意:cat < a.txt > b.txt相当于a复制到b,相当于把文件清零;cat < a.txt >> b.txt 相当于不断追加a.txt的内容,文件会自己膨胀,直至塞满硬盘。】
其它应用例如:
mail -s "Please Call" admin@xxxx.com <
hello!missli
nice to meet you!
Please give me a call when you get in.
to do some maintenance on server1.
Details when you're on-site
jk
EOF(前后都不能有空格)
小括号():合并多个程序的STDOUT,例如( cal 2007 ;cal 2008 ) > all.txt
set -C命令:禁止覆盖重定向;>|:强制覆盖重定向(与set -C相反);
set +C命令:解除禁止覆盖重定向的设置;
基础命令
把标准错误输出定向到文本,屏幕上就不输出标准错误信息;
也可以把标准错误输出定向到1文本,标准输出定向到文本2;例如:
基础命令
管道符(|)作用是把前一个命令的执行结果当做后一个命令的输入;w | tee b.log;可以重定向到文本又可以在终端上显示;加-a选项可以追加到文本,不覆盖,即w | tee -a(append附加) b.log;例如:w | tree -a b.log | tr 'a-z' 'A-Z'即在文本中保存w命令结果,在屏幕显示同时,完成大小写转换;
管道中 - 符号
例如:
将 /home 里面的文件打包,但打包的数据不是记录到文件,而是传送到 stdout,经过管道后,将 tar -cvf - /home 传送给后面的 tar -xvf - , 后面的这个 - 则是取前一个命令的 stdout, 因此,就不需要使用临时file了,tar -cvf - /home | tar -xvf - 。
2.tr 转换和删除字符,或压缩空格,tr -s ' '就可以把空格压缩掉,单引号中间键入空格,第二字符集不写;
tr [OPTION] 第一字符集 [第二字符集],如:tr 1234 xyz会把123456中的1234替换成xyzz,多余的会以z替换,这时要用 -t选项,没有的就不替换了;
-c –C --complement:取相反的,例如tr -dc '123',除了123都删,连回车已删除,这时只能用ctrl+d键;
-d --delete:删除所有属于第一字符集的字符,tr -d ' n ' seq.log把竖列换成横列
-s --squeeze-repeats:把连续重复的字符以单独一个字符表示,但不连续的保留,即压缩,可以压缩空格,如tr -s “”(中间空格) < a.out 或者压缩替换成加号ts -s " 此处键入空格" + < a.out
-t --truncate-set1:将第一个字符集对应字符转化为第二字符集对应的字符,
[:alnum:]:字母和数字;[:alpha:]:字母;
[:cntrl:]:控制(非打印)字符;
[:digit:]:数字 ;[:graph:]:图形字符;
[:lower:]:小写字母;[:print:]:可打印字符; [:upper:]:大写字母;
[:punct:]:标点符号; [:space:]:空白字符;
[:xdigit:]:十六进制字符;
3.cat [OPTION]... [FILEname]...
-E:显示行结束符$;只是显示回车换行,其它不见;
-n:对显示出的每一行进行编号,包括空行;
-A:显示所有控制符,可以见到所有的,看脚本可以用来排错;
-b:非空行显示编号,空行不显示编号,配合-s使用
-s:压缩连续的空行成一行,空行也显示;是压缩相邻的空行;
nl filename也可以加行号,类似cat -n;tac filename显示的是和cat显示的相反;rev 1.txt是行里反着显示
4.seq:默认从1开始,-s支持分隔符,例如基础命令
5.head默认显示前十行,包括空行;格式:head [OPTION]... [FILEnamei]...,可以跟多个文件
-n(number),显示test.txt文件的前几行,或者直接 -;-后跟要取第几行的数字;
-c指定取前几个字节,2个字节就是一个a字母;
-v显示文件名,一般配合-n;
6.tail显示文件尾部,默认后10行;tail [OPTION]... [FILEname]...
-n # 指定获取后#行,n可以省略;
-c # 指定获取后#字节
-v显示文件名
-f 跟踪显示文件fd新追加的内容,常用日志监控,有新内容就显示;删除文件就不显示;
相当于 --follow=descriptor
-F 跟踪文件名,相当于--follow=name --retry,根据文件名跟踪,删除文件,建立相同的文件名就又跟踪;
当tail运行时有进程,所以ll /proc/pidof tail(反引号)/fd,可见文件描述符号;
tailf类似tail -f,只不过当文件不增长时不访问,相对来说节约资源,对系统IO影响比较小;
7.sort:就是用来排序的,不改变原始文件。sort读取每一行输入,并按照指定的分隔符(默认为空格)将每一行划分成多个字段,这些字段就是排序的对象。同时,sort可以指定何种排序规则进行排序,默认使用当前字符集即ascii码排序规则,这时排序如果末尾有空行会排序出空行在第一位;因为sort默认的排序方式是升序,这时如果搭配head -n使用要注意,取的行数里面包括空行;还可以按照字典排序规则、数值排序规则、按照月份排序规则、按照文件大小排序规则,格式:sort [options] filename
-r以降序排列,注意:这个选项并不参与排序,而是操作排序完成后的结果;-R随机排序;
-n(number)以数值大小,从大到小来排序,因为sort默认是按照数值的位排序;
-t c:使用c做为字段界定符;例如-t:是以:作为分隔符,
-k X 选项按照使用c字符分隔的X列来排,-t指定分隔符是什么,-k指定第几列;
-u 选项(独特,unique)删除输出中的重复行;
-f 忽略(fold)字符串中的字符大小写,
8.uniq命令:从输入中删除前后相接的重复的行;格式:uniq [option]... filename
-c: 显示每行重复出现的次数;
-d: 仅显示出现重复的行;
-u: 仅显示没有重复的行;
注:连续且完全相同方为重复;
常和sort 命令一起配合使用:sort a.txt | uniq -c;例如列出两个不同文件夹下重复的文件:
[root@centos7 ~]#ls /root > /tmp/root.log
[root@centos7 ~]#ls /data > /tmp/data.log
[root@centos7 data]#grep -f /tmp/data.log /tmp/root.log,-f 满足其中的一个就显示,
f1_2.log
f1.log
[root@centos7 ~]#sort /tmp/data.log /tmp/root.log | uniq -d
f1_2.log
f1.log
[root@centos7 ~]#ls /root /data -1|sort |uniq -d
f1_2.log
f1.log
[root@centos7 ~]#( ls /root ;ls /data ) | sort |uniq -d
f1_2.log
f1.log
取出两个不同目录中不同的文件列表
[root@centos7 ~]#ls /root > /tmp/root.log
[root@centos7 ~]#ls /data > /tmp/data.log
[root@centos7 data]#grep -vf /tmp/data.log /tmp/root.log ;-v取反,-f根据模式文件取;
anaconda-ks.cfg
Desktop
[root@centos7 ~]#sort /tmp/data.log /tmp/root.log | uniq -u
anaconda-ks.cfg
Desktop
[root@centos7 ~]#( ls /root ;ls /data ) | sort |uniq -u
anaconda-ks.cfg
Desktop
9.cut按列查看文本,格式:cut option filename
-d(delimiter):指明分隔符,默认时tab键;-f:是取第几列,可以1,也可以1,3,6也可以1-6还可以混合使用,1-3,7这么表示;-c是按字符数来取,可以导出文本用vim看,前提是对齐的;
--output-delimiter=符号:可以在输出是指定什么分隔符;
如:cat /etc/passwd | cut -d: -f1,3 --output-delimiter=+即用加号显示结果基础命令;
若是用字符取分区利用率,可以df>df.log,用vim df.log;看右下角是第几行的第几个字符,然后再取df | cut -c34-36就可以取出需要的列,前提是对齐的文本,当然也可以:
基础命令
例如取ip地址的一种方式:
基础命令
paste 合并两个文件的同行号的列到一行;
paste [OPTION]... [FILE]...
-d 分隔符:指定分隔符,默认用TAB
-s : 所有行合成一行显示;例如:
基础命令;
11.wc统计文本时,显示的第一个是行数,第二个是单词数(按空格计),第三个是字节数(一个字母算一个字节);-l 只计数行数;-w 只计单词总数;-c 只计字节总数;-m 只计字符总数;对于英文字母来说,一个字节就是一个字符,因为1个ascii码对应一个字节;但中文不同,1个汉字即1个字符对应3个字节;
-L 显示文件中最长行的长度;ls -1|wc -L可查出字符数最多的文件名;注意ls查看时文件都显示成一行,但实际上它是一个文件一行,ls输入到文本中可查看,ls -1可成列显示,再wc -L可统计出;
12.比较两个文件之间的区别:2c2表示第二行;3a4表示第三行到第四行;
基础命令;
加-u选项可以找出不同之处保存以备还原;
基础命令;假设rm -rf f2.log;
基础命令
注意:还原的f2.log文件名变成f1.log,原来的f1.log变成f1.log.orig后缀的文件;
13.grep:文本过滤(模式:pattern)工具;根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行
模式:由正则表达式字符及文本字符所编写的过滤条件;
语法:grep [options] 模式 [filename];最简单的语法是单纯的字符串;例如:grep root /etc/passwd;例如取ens33的ip所在行:ifconfig ens33 | grep netmask ;或者ifconfig ens33 | grep ask;
-i忽略大小写 grep -i root /etc/passwd;-v不包含,取反,如grep -v root /etc/passwd不包含root的行;-m匹配几次,如3次:grep -v root -m 3 /etc/passwd意思是取前三个不包括root的行; -n显示匹配的行号;-c统计出匹配的行数,例如统计1-100之间多少个带9的数字,seq 100 | grep -c 9,19个,出现多少次9则是seq 100 | grep -o 9| wc -l,20,因为最后99出现2次;-o只显示匹配的字符串本身,例如grep -o root /etc/passwd,只显示匹配到的root,如果和c搭配,-oc,是按行统计的root,而不是多少个,因为一行中多少个它不统计,这时就要搭配wc -l 命令;
-A # after, 后#行;包含关键字的后#行,包含关键字那行的后几行,
-B # before, 前#行;关键字的前几行;例如:grep -B 1 up nmap.log,包含关键字起始的那行的前1行;
-C # context, 前后各#行;grep -nC3 root /etc/passwd即包含root关键字的前后三行,含本行;
-e代表OR,关键字1或者关键字2的行,例如grep -e root -e nologin /etc/passwd;并且的就过滤2次:
gerp root /etc/passwd | grep nologin
-w匹配单词;数字,字母,下划线都算单词;-hello-前后的符号算单词的分界线;
-f file 根据模式文件处理,满足文件里的一个就显示,类似-e;
--color=auto: 对匹配到的文本着色显示;
-q 静默模式,不输出任何信息,只关心找到找不到,找到echo $?=0;找不到echo $?=1;
注意:/misc神奇的文件夹,cd/misc;cd cd/自动挂载光盘到/misc/cd文件夹,centos7下启用systemctl start autofs
才可以进/misc;
14.正则表达式:REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能;程序支持:grep,sed,awk,vim, less,nginx,varnish等
分两类:基本正则表达式:BRE;扩展正则表达式:ERE,grep -E,即egrep;
正则表达式引擎:采用不同算法,检查处理正则表达式的软件模块;
元字符分类:字符匹配、匹配次数、位置锚定、分组;
字符匹配:
. 匹配任意单个字符,注意:点. 匹配除 "n" (Linux中n表示回车+换行,回车(ACSII:13 或0x0d),换行(ACSII:10 或0x0a))之外的任何单个字符。例如:ls /data | grep ...表示包含3个字符,不是就三个字符,ls /date | grep '../.log' 就可以过滤出文件名是.log后缀的文件名;
[] 匹配指定范围内的任意单个字符,示例:[jk] [0-9] [a-z] [a-zA-Z];
[^] 匹配指定范围外的任意单个字符,不包括中括号内的;
[:alnum:] 字母和数字;
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z;
[:lower:] 小写字母 [:upper:] 大写字母;
[:blank:] 空白字符(空格和制表符);
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广);
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...);
[:digit:] 十进制数字 [:xdigit:]十六进制数字;
[:graph:] 可打印的非空白字符;
[:print:] 可打印字符;
[:punct:] 标点符号;
匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数。星号:匹配星号前,不同于通配符中的星号,通配符中表示任意长度的任意次数,这里是星号前的字符的任意次,包括0次;例如a**通配符中表示a后面跟什么都可以,而在正则表达式中:表示a前面什么也没有也行,即使空也算,不是指空行,例如b符合条件,因为b表示空,没a,后面是a,aa,aaa,不管多少次只能是a,a是重复的和空; 写的时候加上双引号,以防止误认为是通配符;
备注:当问号紧跟在任何一个其他限制符 如星号,+, ?, {n}, {n,}, {n,m}后面时,匹配模式是非贪婪的。非贪婪模式尽可能短的匹配所搜索的字符串,而默认的贪婪模式则尽可能长的匹配所搜索的字符串。
点星号 .* 任意长度的任意字符,相当于通配符的星号;
? 匹配其前面的字符0或1次
+ 匹配其前面的字符至少1次
{n} 匹配前面的字符n次
{m,n} 匹配前面的字符至少m次,至多n次
{,n} 匹配前面的字符至多n次
{n,} 匹配前面的字符至少n次
位置锚定:
^:匹配行首;
$:匹配行尾;
<,b:匹配词首;
>,b:匹配词尾。
分组:
():生成分组模式;
后向应用:1,2,...