您的位置:首页 > 运维架构 > Linux

Linux中常用的文本处理命令详解

2020-01-15 03:36 627 查看

一.Linux中常用的文本处理命令(shell中常用的命令)

a=

命令
|可把命令的结果赋值给a

1、diff

(1)显示结果解释

[num1.num2][a/c/d][num3,num4]

(1)

num1、num2表示在第一个文件中的行数

(2)

a表示添加
c表示更改
d表示删除

(3)

num3、num4表示在第二个文件中的行数

(4)

< 表示第一个文件中的内容
> 表示第二个文件中的内容

(5)

例如2,3c2,3表示改变第一个文件中第二和第三行,即可匹配第二个文件中的第二和第三行
例如1a2,>456,意为第一个文件为1行,第二个文件为2行,需给第一个文件添加内容为“456”的第2行才可与第二个文件匹配
例如2d1,<456,意为第一个文件为2行,第二个文件为1行,需给第一个文件减少内容为“456”的行才可与第二个文件匹配

(2)常用diff命令

diff file1 file2	|对比file1、file2文件的内容差别并显示
diff -b file1 file2	|对比file1、file2文件的内容差别,忽略空格区别并显示
diff -B file1 file2	|对比file1、file2文件的内容差别,忽略空行区别并显示
diff -i file1 file2	|对比file1、file2文件的内容差别,忽略大小写区别并显示
diff -u file1 file2	|以合并的方式显示文件内容的差别
diff -c file1 file2	|显示全部内容,标出有差别的行(以“!”标出)
diff -p c1 c2		|比较c1、c2文件的差别,这两个文件为c语言的程序码文件,显示有区别的函数名称
diff -r dir1 dir2	|对比dir1、dir2子目录中的文件并显示

2、patch

diff -u file1 file2 > file.path		|用diff命令生成一个file1的补丁文件file.path
yum install patch -y				|需要安装patch
patch file1 file.patch				|安装后使用patch 给file1文件用file.path打补丁,此时打过补丁的file1文件原文件不被保存,直接保存修改后的新文件
patch -b file1 file.patch			|给file1文件用file.path打补丁,此时原文件被保存为file1.orig,新文件为file1

3、cut

cut -d 						|指定文件中的分隔符
cut -d : file				|指定file文件中的分隔符“:”
cut -f						|指定截取的列
cut -d : -f 1-3	file		|截取file中以分隔符隔开的1-3列
cut -d : -f 1,3 file		|截取file中以分隔符隔开的1、3列
cut -c						|指定截取的字符的位置
cut -c 1-4 file				|截取file中的1-4列字符
cut -c 1,4 file				|截取file中的1、4列字符

4、sort

sort file					|给file中的内容排序,默认只按第一个字符排序
sort -n file				|给file中的内容排序,按照数字大小排序(从小到大)
sort -r file				|给file中的内容排序,倒序(从大到小)
sort -rn file				|给file中的内容排序,倒序按数字大小排序(从大到小)
sort -run file				|u为省略重复的数字,倒序按数字排序
sort -un file				|正序按数字排序,省略重复
sort -o						|将结果输出到某个文件
sort -t						|指定分隔符
sort -k						|指定列
sort -t : -k 1 file -o abc	|将file文件中的内容以“:”分隔符,指定第1列的字符排序,将结果输出到abc文件中

5、uniq

sort -n file |uniq -u		|将结果中只有一次的内容显示出来
sort -n file |uniq -c		|统计内容出现的次数和内容信息,并显示出来
sort -n file |uniq -d		|将结果中有多次的内容显示出来

6、&& 和 ||

&&			|意为若条件成立(真),则
||			|意为若条件不成立(假),则
&& echo yes	|若条件成立,显示yes
|| echo no	|若条件不成立,显示no

7、test

test "$a" = "$b" 等同于 [ "$a" = "$b" ]
[ "$a" = "$b" ]						|检测a的值是否等于b的值
[ "$a" != "$b" ]					|检测a的值是否不等于b的值
[! "$a" = "$b" ]					|检测a的值是否等于b的值的非
[ "$a" -eq "$b" ]					|检测a的值是否等于b的值
[ "$a" -ne "$b" ]					|检测a的值是否不等于b的值
[ "$a" -le "$b" ]					|检测a的值是否小于等于b的值
[ "$a" -lt "$b" ]					|检测a的值是否小于b的值
[ "$a" -ge "$b" ]					|检测a的值是否大于等于b的值
[ "$a" -gt "$b" ]					|检测a的值是否大于b的值
[ "$a" -lt "$b" -a "$a" -gt "$c" ]	|检测a的值是否小于b的值且大于c的值
[ "$a" -lt "$b" -o "$a" -gt "$c" ]	|检测a的值是否小于b的值或大于c的值

8、grep 文本过滤命令

grep root(匹配条件) file(处理文件)	|在file的内容中搜索匹配条件的内容并显示
grep ^root file						|将以root开头的内容显示出来
grep root$ file						|将以root结尾的内容显示出来
grep -i root file					|搜索时不区分root的大小写
grep -E "^root|root$" file			|扩展grep的模式下,可以同时有多条匹配条件
grep -E "\<root" file				|root字符前不能有其他字母
grep -E "root\>" file				|root字符后不能有其他字母
grep -E "\<root\>" file				|root字符前后均不能有其他字母
grep -E "a*b" test					|将test中含有a(不限制a的数量)b的内容显示出来
grep -E "a.*b" test					|将test中含有a(不限制字符数量和内容)b的内容显示出来
grep -E "a{2,3}b" test				|将test中含有a(有2-3个a)b的内容显示出来
grep -E "a{,4}b" test				|将test中含有a(0-4个)b的内容显示出来
grep -E "a{4,}b" test				|将test中含有a(4-无穷)b的内容显示出来
grep -E "a?b" test					|将test中含有a(0-1个)b的内容显示出来
grep -E "a+b" test					|将test中含有a(1-无穷)b的内容显示出来
grep -E "(ab)*" test				|将test中含有ab(不限制ab的数量)的内容显示出来
grep -E "(ab){3,}" test				|将test中含有ab(3-无穷个ab)的内容显示出来

9、sed

-n					|不输出模式空间中的内容
-e					|多条策略(“;”隔开的)同时生效

P模式

sed '5p' fstab					|查看fstab第5行的内容,此时会默认输出模式空间中的内容
sed -n '5p' fstab				|查看fstab第5行的内容(此时仅第5行显示)
sed -n '1,5p' fstab				|查看fstab第1-5行的内容
sed -ne '1p;5p' fstab			|查看第1、第5行的内容
sed -ne '1p' -ne '5p' fstab		|查看第1、第5行的内容

D模式

sed '/UUID/d' fstab				|删除fstab中含有UUID的行
sed '/UUID/d!' fstab			|删除fstab中不含有UUID的行
sed '/^UUID/d' fstab			|删除fstab中以UUID开头的行
sed '/#/d' fstab				|删除fstab中含有#的行
sed '/UUID/d;/fstab/d' fstab	|删除fstab中含有UUID或fstab的行
sed '/\(UUID\|fstab\)/d' fstab	|删除fstab中含有UUID或fstab的行
sed '/etc/{/fstab/d}' fstab		|删除fstab中含有etc且含有fstab的行
sed '/#/{/etc/{/fstab/d}}' fstab|删除fstab中含有#且含有etc且含有fstab的行

A模式

sed '/#/a @@@@@' fstab				|给fstab中含有#的行添加@@@@@,添加至行后一行

I模式

sed '/#/i @@@@@ lalalala' fstab		|给fstab中含有#的行插入@@@@@ lalalala,插入至行前一行
sed '/#/i @@@@@\nlalalala' fstab	|给fstab中含有#的行插入@@@@@(换行)lalalala。插入至行前一行

C模式

sed '/etc/c yeahhhhhhhhhh' fstab	|将fstab中含有etc的行内容改变为yeahhhhhhhhhh

W模式

sed '/etc/w 123' fstab				|将fstab中含有etc的行的内容输出保存至123文件内

sed的其他用法

sed -n '/ftp/=' passwd						|显示passwd中内容含有ftp的行是第几行(只有行号)
sed '/ftp/=' passwd								|显示passwd中内容含有ftp的行是第几行,且显示模式空间内容(在文中显示行号)
sed -ne '/ftp/p;/ftp/=' passwd					|显示passwd中内容含有ftp的行是第几行,且显示该行(有行号和该行)
sed -e 's/:/@/g' passwd							|将passwd中每一行、每一列的“:”替换为“@”(s代表每一行,g代表每一列)
sed -e 's/:/@/' passwd							|将passwd中每一行、第一列的“:”替换为“@”(默认仅替换第一列)
sed -e '2,4s/:/###/' passwd						|将passwd中的2-4行、第一列的“:”替换为“@”
sed -e '2,4s/:/###/g;5,7s/sbin/AAAAAAA/' passwd	|将passwd中的2-4行,每一列的“:”替换为“@”,5-7行、第一列的“sbin”替换为“AAAAAAA”
sed '/^root/,/^daemon/s/:/####/g' passwd		|将passwd中以“root”开头的行到以“daemon”开头的行之间(包括该两行)的每一列的“:”替换为“####”
sed 's/\//####/' passwd							|将passwd中每一行第一列的“/”替换为“####”
sed 's/\//####/g' passwd						|将passwd中每一行每一列的“/”替换为“####”
vim rule										|建立一个rule策略文件,写入需要的策略,策略为命令引号中的内容,如2,4s/:/###/等
sed -f rule passwd								|将rule策略文件中的策略对passwd执行
sed 'G' rule									|给rule文件的每一行后换行
sed '$G' rule									|rule文件的最后一行后换行
sed '$!G' rule									|rule文件的最后一行后不换行(其他行换行)
sed '=' rule									|给rule中的每一行标出行号(在该行前一行标出)
sed '=' rule |sed 's/\n/ /g'					|试图将换行符替换为空格,将行号与内容放在同一行,此时因为读取rule的内容时是一条一条读取的,所以无法替换换行符
sed '=' rule |sed 'N;s/\n/ /g'					|N为一次读取两行进行处理,这样就可以实现将行号与内容放在同一行
sed -n '$p' rule								|显示rule最后一行的内容
sed -n '$=' rule								|显示rule的最后一行的行号

10、awk

awk '{print FILENAME}' test							|每处理一条内容,输出一条FILENAME打印到屏幕,FILENAME代表处理的文件名,比如此时为test
awk '{print 123}' test								|每处理一条内容,输出一条123打印到屏幕
sed '=' passwd |sed 'N;s/\n/\t/g' > test			|建立一个便于测试的文件test
awk 'NR\==3{print}' test							|打印test第3行的内容
awk 'NR\==3||NR==5{print}' test						|打印test第3行和第5行的内容
awk -F : '{print $3}' test							|指定分隔符为“:”,打印第3列的内容
awk -F : '{print $3$5}' test						|指定分隔符为“:”,打印第3和第5列的内容,此时两列内容连在一起
awk -F : '{print $3,$5}' test						|指定分隔符为“:”,打印第3和第5列的内容,两列内容之间用空格隔开
awk -F : '{print $3"###"$5}' test					|指定分隔符为“:”,打印第3和第5列的内容,两列内容之间用“###”隔开
awk -F : 'BEGIN{print "NAME"}{print $1}END{print "END"}' passwd	|指定分隔符为“:”,先执行打印“NAME”字符的命令,再执行打印出passwd第一列的命令,最后执行打印出“END”的命令
awk -F : '/^root/{print $1}' passwd					|指定分隔符为“:”,打印出passwd中以root开头的第一列的内容
awk '/^root/{print}' passwd							|打印出passwd中以root开头的行的内容
awk -F : '/bash$/{print $1}' passwd					|指定分隔符为“:”,打印出passwd中以bash结尾的第一列的内容
awk '/bash$/{print}' passwd							|打印出passwd中以bash结尾的行的内容
  • 点赞
  • 收藏
  • 分享
  • 文章举报
噜噜噜的说~ 发布了39 篇原创文章 · 获赞 12 · 访问量 443 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: