《鸟哥》
认识学习bash
管道命令
grep:分析一行数据
依次是:获取last
中包含reboot的行;获取不包含reboot的行;获取不包含reboot的行的用户名
梨子:获取/etc/passwd里面包含elyer的那几行:
排序命令
sort
建议排序前把语系统一:LANG=C
选项与参数:
-f :忽略大小写的差异,例如 A 与 a 视为编码相同;
-b :忽略最前面的空格符部分;
-M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
-n :使用『纯数字』进行排序(默认是以文字型态来排序的);
-r :反向排序;
-u :就是 uniq ,相同的数据中,仅出现一行代表;
-t :分隔符,默认是用 [tab] 键来分隔;
-k :以那个区间 (field) 来进行排序的意思
写个简单的测试:可以看到sort默认排序是大写在前面,后面才是小写从a-z
看个栗子:-t
是以什么符号进行分隔,-k
是以第三块区域进行排序
还有个梨子:只提取last的账号并排序
uniq
uniq可以不显示重复的,加上-c
选项可以看到重复了多少次
wc
查看文件有多少字多少行多少字符数
选项与参数:
-l :仅列出行;
-w :仅列出多少字(英文单字);
-m :多少字符;
例子:获取last的登录用户数,首先只有字母开头的行才是,而且wtmp那行不是用户,有了这两个条件就能筛选出了
双向重导向
tee
这个东东可以把你处理的过程或者说结果显示在屏幕上的同时,还可以存到文件里,双向大概就是这个意思,可以同时输出到两个地方:屏幕和文件
看个例子就明白了,
字符转换命令
tr
删除文字或者替换文字
把小写全部改成大写:
把冒号全部删掉:
col
把tab
转成空格
里面的很多^I
就是Tab
的意思,
处理完,可以看到Tab
都没了:
join
用来处理两个文件的相同之处
从前三行就可以看出两个文件合并了
选项与参数:
-t :join 默认以空格符分隔数据,并且比对『第一个字段』的数据,
如果两个文件相同,则将两笔数据联成一行,且第一个字段放在第一个!
-i :忽略大小写的差异;
-1 :这个是数字的 1 ,代表『第一个文件要用那个字段来分析』的意思;
-2 :代表『第二个文件要用那个字段来分析』的意思。
可以看到group的第3列和passwd的第4列有关联,于是把它们整合到一块儿:
paste
将两行粘贴在一起,中间用Tab
隔开
可以利用管道把group和file1/2合并 且只显示前3行
expand
把Tab键转换成空格
/etc/man.config
内行首为 MANPATH 的取出;仅取前三行,发现有很多^I的符号,其实这是Tab键
那怎么把这些讨厌的符号去掉呢,用6个空格键取代掉,
分割命令
split
把大文件切割成小文件
把passwd以300k的大小分成小文件啦,再利用重定向把小文件都整理在一起,
把ls输出的信息,按10行一份整理成文件:
xargs
看的云里雾里 不知道这家伙的威力,好家伙,看例子:来自这里
可以看到 echo ‘–help’ | cat 该命令输出的是echo的内容,也就是说将echo的内容当作cat处理的文件内容了,实际上就是echo命令的输出通过管道定向到cat的输入了。然后cat从其标准输入中读取待处理的文本内容。这等价于在test.txt文件中有一行字符 ‘–help’ 然后运行 cat test.txt 的效果。
而 echo ‘–help’ | xargs cat 等价于 cat --help 什么意思呢,就是xargs将其接受的字符串 --help 做成cat的一个命令参数来运行cat命令,同样 echo ‘test.c test.cpp’ | xargs cat 等价于 cat test.c test.cpp 此时会将test.c和test.cpp的内容都显示出来。
-
减号的用处
stdin
与stdout
可以利用减号 “-” 来替代,例如:
[root@www ~]# tar -cvf - /home | tar -xvf -
正则表达式
基础正则
语系的影响
LANG=C 时:0 1 2 3 4 … A B C D … Z a b c d …z
LANG=zh_TW 时:0 1 2 3 4 … a A b B c C d D … z Z
设置LANG=C哦
有些特殊符号的意义要记住:
grep进阶
选项与参数:
-A :后面可加数字,为 after 的意思,除了列出该行外,后续的 n 行也列出来;
-B :后面可加数字,为 befer 的意思,除了列出该行外,前面的 n 行也列出来;
–color=auto 可将正确的那个撷取数据列出颜色
grep -n 显示出行号:
注意:== ^ 符号,在字节集合符号(括号[])之内与之外是不同的! 在 [] 内代表『反向选择』,在 [] 之外则代表定位在行首的意义!==
例如:在括号最外面表示行首是小写字母的选出来
不是英文字母开头的:
以.
结束的:
只有行首和行尾,会给你找出空白行:
正则里的.
和*
.
(小数点):代表『一定有一个任意字节』的意思;
*
(星星号):代表『重复前一个字节, 0 到无穷多次』的意思,为组合形态
grep -n 'ooo*' regular_express.txt
会把带两个o的都列出来,‘o*’会把所有东西都列出来,跟o无关
找出含有任意数字的,这两种用法都可以:
鸟哥再次强调:『正规表示法的特殊字节』与一般在命令列输入命令的『万用字节』并不相同
来自《鸟哥》的正则字符汇总图:
sed工具
也是个管道命令,可以分析标准输入,还可以将数据进行取代、删除、新增、提取等功能
选项与参数:
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN
的数据一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过
sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的
sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是由萤幕输出。
动作说明: [n1[,n2]]function
n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作
是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』
function 有底下这些咚咚:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配
正规表示法!例如 1,20s/old/new/g 就是啦!
用来删除某几行:
增加行:
增加多行:
取代功能:
显示想要的行:(加了-n是安静选项,只会输出一次)
数据搜索与取代
先提取addr那行,先把前部分删除,再把后部分删除。
1.grep提取包含MAN的:
2.有#的都用空格替代:
3.去掉空格哦
直接修改文件内容危险操作
上面的命令看着挺复杂的,趁现在还理解,说一下把:先把框架提取出来s///g是必备的,.就是.的意思,$是最后一个字符的意思,也就是说以.结尾的行,替换成什么呢,就是后面的!,!只是转义罢了,因为!是特殊字符嘛~所以就很好理解咯,把.结尾的行全部改成!结尾。
延伸正则
egrep
利用|
直接删掉了#开头或者空白行
多个范例:
文件格式化等
printf
类似C语言里面的,让你按固定格式输出,%s是字符,%i是数字,%f是小数