1:grep//显示行
# grep 'main' /home/myhome/a.c//将a.c含有main的行显示出来
# grep -v 'main' /home/myhome/a.c //显示除了main那行的所有行
# grep -n 'the' a.c//显示a.c含有the的行
# grep -vn 'the' a.c//显示没有the的行
# grep -in 'the' a.c//不考虑大小写
# grep -n t[ae]st a.c//[]只算一个字符,搜到含有test和tast的行
# grep -n '[^g]st' a.c//显示st的行但是st前临近不能有g
# grep -n [^a-g]st a.c//st前临近不能有小写
# grep -n '^the' a.c //只查找首字符为the的行
# grep -n '^[a-z]' a.c//开头是小写字母的行
# grep -n '^[^a-zA-Z]' a.c //不是英文字母开头的行,^在[]内表反选在外表定位在行首
# grep -n '\.$' a.c //.为特俗含义,用转义字符\,查找最后是.的行。没有$将找有点的行
# grep -n '^$' a.c //空白行,只有首行和尾行
# grep -n 't..t' a.c //..表任意字符,如test,tast等
# grep -n '0*' a.c //0或空格,所以会把所有数据都显示
# grep -n '00*' a.c //所以含有0的行
# grep -n '000*' a.c至少含义两个0的行
# grep -n 't*t' a.c//所以含t的行,t*表示空格
# grep -n 't.*t' a.c//必须含有两个t
# grep -n 'o\{2\}' a.c//{}范围字符,特俗字符用转义字符\去掉特殊性,至少有两个o
# grep -n '^#' a.c //搜索以#开头的行
# grep -n 'd$' a.c //尾行为d
# egrep -n 'go+d' a.c //扩展,一个以上o
# egrep -n 'go?d' a.c//o?空的或一个o
# egrep -n 'good|goood' a.c //两个或三个o
# nl my_printf.sh | sed '2,5d'//nl打印并删除2到5行
2:sed的使用
# sed -n '3,5'p my_printf.sh //打印3~5行
# sed -n '1,$'p my_printf.sh //打印所有行
# grep -n '.*' my_printf.sh | sed -n '3'p//打印第三行并显示行号
# sed -n '/Tom/'p my_printf.sh //打印含有Tom字符串的行,用//
# sed -n '/^I/'p my_printf.sh //打印I 开头的行
# sed -n '/!$/'p my_printf.sh //打印!结尾的行
# sed -e '1'p -e '/T/'p -n my_printf.sh //e相当于传送带,先打印前面再打印后面
# sed '1'd my_printf.sh //删除第一行
# sed '/yes/'d my_printf.sh 删除含有yes的行
# sed '2s/Name/MyName/g' my_printf.sh//替换第二行的Name为MyName,g是全局,没有只替换第一个
# sed 's/s/MyName/g' my_printf.sh //不加行数默认替换所有行
# sed '1,4s/s/MyName/g' my_printf.sh //替换1~4行
# sed 's/[0-9]//g' my_printf.sh//删除所有的数字
# sed 's/[a-z]/\u&/g' my_printf.sh //小写字母全部替换为大写字母
# sed 's/[A-Z]/\l&/g' my_printf.sh //大写字母替换成小写
# sed -n '3s/[A-Z]/\l&/g'p my_printf.sh //大写替换小写并打印第三行
# sed -r 's/(am)(.*)(old)/\3\2\1/' my_printf.sh //将am和old的位置交换,-r表不用脱义\,()表分段
-n :只有经过sed处理的才显示
S :搜索或替换
P :打印
-e :直接在命令行进行sed操作
-r :拓展正则表达式
a :增加
c :替换
d :删除
3:awk的使用
$0 :~# awk '{print $0}' demo.txt //打印所有
$NF :# awk '{print $NF}' demo.txt //打印每行最后一个字段
$1 :~# awk '{print $1}' demo.txt //打印第一个字段
$2 :~# awk '{print $2}' demo.txt // 打印第二个字段
:~# awk '{print $(NF-1),"OK"}' demo.txt//打印倒数第二行并输出OK
:~# awk '{print NR,$0}' demo.txt //打印行号
ENVIRON :~# awk '{print ENVIRON["USER"];}' demo.txt //打印路径
BEGIN ::~# awk 'BEGIN{print ENVIRON["PATH"];}' //执行行前可以输入的数据
# last -n 5 | awk '{print $1}' //打印前五个用户信息的第一个字段
# cat /etc/passwd | awk -F ':' '{print $1}' //-F制定域分隔符为:
# cat /etc/passwd | awk -F ':' '{print $1"\t" $7}' //\t表间隔,账户与shell是与Tab分开
# awk -F: '/root/' /etc/passwd //匹配了pettem(root)才执行action(没指定则输出行内容)
# awk -F: '/root/{print $7}' /etc/passwd //含有root的行并打印对应的shel
# awk -F ':' '{print "文件名:" FILENAME ",行号:" NR ",行数:" NF ",内容:" $0}' /etc/passwd
# awk -F ':' '{printf("文件名:%10s,行号:%s,行数:%s,内容:%s\n",FILENAME,NR,NF,$0)}'
/etc/passwd
4:diff 差异比较
Linux中Diff命令的功能为逐行比较两个文本文件,列出其不同之处。它对给出的文件进行系统的检查,并显示出两个文件中所有不同的行,不要求事先对文件进行排序。通过比较使得旧文件和新文件一样得做什么!
# cat f1.txt
hello
world
# cat f2.txt
hello
world_my
good
# diff f1.txt f2.txt
2c2,3
< world //旧文件应该减少的内容
---//分隔符
> world_my //旧文件应该增加的内容
> good
;>要添加一行旧文件才和新文件一样
;f1.txt旧文件内容,f2.txt新文件内容
;“<”表示后面文件比前面文件少了1行内容,对应旧文件
;“>”表示后面文件比前面文件多了1行内容,对应新文件
# diff -u f1.txt f2.txt //合并比较
--- f1.txt 2015-11-26 22:27:06.589702164 +0800
+++ f2.txt 2015-11-26 22:25:47.356186772 +0800
@@ -1,2 +1,3 @@
hello
-world
+world_my
+good
生成补丁文件patch
# diff -u f1.txt f2.txt >f1-f2.patch
# cat f1-f2.patch
--- f1.txt 2015-11-26 22:27:06.589702164 +0800
+++ f2.txt 2015-11-26 22:25:47.356186772 +0800
@@ -1,2 +1,3 @@
hello
-world
+world_my
+good
目录比较
//test1的a.txt多了cc;test1没有f1.txt,f2有f1.txt
# diff -uNr test1 test2
diff -uNr test1/a.txt test2/a.txt
--- test1/a.txt 2015-11-26 22:52:47.243168226 +0800
+++ test2/a.txt 2015-11-26 22:48:14.669955070 +0800
@@ -1,3 +1,2 @@
aa
bb
-cc
diff -uNr test1/f1.txt test2/f1.txt
--- test1/f1.txt 1970-01-01 08:00:00.000000000 +0800
+++ test2/f1.txt 2015-11-26 22:50:13.508227936 +0800
@@ -0,0 +1,2 @@
+hello
+world
打补丁
# patch f1.txt <f1-f2.patch //当前目录
撤销补丁:# patch -R f1.txt <f1-f2.patch
目录打补丁:把生成的补丁文件放到要打补丁的旧文件目录,
然后:# patch -p1 < test1-to-test2.patch
;-p1表示取消一级目录