Linux 中常用的文本(行)处理命令
0、正则表达式(regular expression)
元字符(如下图)是正则表达式中含有的字符,在正则表达式中可以在字符串中使用元字符以匹配字符串的各种可能的情况。
注意:
(1) 在“[ ]”中还可以使用“-”来表示某一范围。例如“[a-z0-9]”匹配任意的小写字母或者数字,“[^A-Z]”表示非大写字母,“[0-9]{8}”表示任意一个8位数字。
(2) 元字符还可以配合使用:
“.*”可以匹配任意个字符,如“r.*d”会匹配“rd”、“red”、“read”。
“.+”可以匹配任意的一个或者多个字符,如“r.+d”会匹配“red”、“read”,但不会匹配“rd”。
“.?”可以匹配任意的零个或一个字符,如“r.?d”会匹配“rd”、“red”,但不会匹配“read”。
“^$”匹配空白行。
(3) 在[ ]中还可以使用一些特殊匹配模式,如下表:
以“\”开头得元字符
1、 grep命令
命令说明:按行处理,输出文件中包含搜索字符串的所有行。
格式:grep [-acinv] ‘搜索字符串’ filename
参数说明:
-a:在二进制文件中,以文本文件的方式搜索数据;
-c:计算找到“搜索字符串”的次数;
-i:忽略大小写;
-n:输出行号;
-v:反向选择;
-E:扩展正则表达式
例子:在文件a.txt中搜索包含字符串good或glad的行:
grep -E ‘g(oo|la)d‘ a.txt
找到以字母a结尾的单词:
grep -E ‘a[[:blank]]‘ a.txt
grep -E ‘a\\b‘ a.txt
2、find命令
命令说明: 查找符合条件的文件
格式:find [path] [options][tests] [actions]
参数说明:
3、cut命令
命令说明:按行处理,将一行消息的某段切出来。
格式:cut -d ‘分割字符‘ -f fields
cut -c m-n
例如:echo $PATH | cut -d ‘:‘ -f 3,5,取出环境变量PATH中的第3个和第5个路径。
echo $PATH | cut -d ‘:‘ -f 3-5,取出环境变量PATH中的第3个到第5个路径。
export | cut -c 12-, 将export中的每行的前面11个字符删除留,保留从第12个字符开始的所有字符。
4、awk工具
命令说明: 将一行消息分成数个段来处理,适合处理小型的数据。
格式:awk ‘条件类型 {动作}‘ file
awk的内置变量:
$n:该行的第n个字段;
NF:每一行拥有的字段总数;
NR:当前行的行号;
FS:分隔符,默认为空格键;
例如:cat /etc/passwd | awk ‘BEGIN {FS=":"} $S3<10 {print $1 "\t" $3}‘,打印passwd文件第三栏小于10的行的第1、3栏。
5、sed工具
命令说明: 分析STDIN的数据,将数据处理后,输出到STDOUT。
格式:sed [-nefr] 动作
参数说明:
-n:安静模式,仅显示经过sed特殊处理的行;
-e:直接在命令行模式进行sed的操作编辑;
-f file:将sed操作写在一个文件中;
-r:支持扩展正则表达式语法;
动作说明:[n1[, n2]] functions
其中,n1和n2代表“选择进行操作的行数”,function有下面这些操作:
a:新增,例如:nl /etc/passwd | sed ‘2a Hello World‘,在/etc/passwd第2行下面新增一行,写入"Hello
World"。
i:插入,例如:nl /etc/passwd | sed ‘2i Hello World‘,在/etc/passwd第2行上面新增一行,写入"Hello World"
c:替换,例如:nl /etc/passwd | sed ‘2,5c Hello World‘,将/etc/passwd第2至5行的内容替换为“Hello
Wolrd”。
d:删除,例如:nl /etc/passwd | sed ‘2,5d‘,删除/etc/passwd中的第2至5行。
p:打印,例如:nl -n /etc/passwd | sed ‘2,5p‘,仅显示2到5行,注意,如果不加-n,2到5行将重复输出。
s:搜索,例如:nl /etc/passwd | sed ‘1,20s/old/new/g‘,将第1~20行中出现的所有字符串old替换为new。
6、sort命令
命令说明:将文本文件的内容按行排序。
格式:sort [-fbMnrtuk] [file or stdin]
参数说明:
-f:忽略大小写;
-b:忽略最前面的空格;
-u:即uniq,重复行仅出现一次;
-M:以月份的名字来排序;
-n:使用“纯数字”来排序;
-r:反向排序;
-t:分隔符,默认为tab键;
-k:按指定字段排序;例如:
cat /etc/passwd | sort -t ‘:‘ -k 3,对文件/etc/passwd以第三栏排序。
7、uniq命令
命令说明:如果排序完成了,将重复的行仅显示一次。注意,若文件未排序,该命令失效。
格式:uniq [-ic]
参数说明:
-i:忽略大小写;
-c:统计每行重复的次数;
8、wc命令
命令说明:统计文本文件中有多少字,多少行,多少字符。
格式:wc [-lwm]
参数说明:
-l:仅显示行数;
-w:仅显示字数(英文单词个数);
-m:字符数;
9、tee命令
命令说明:双向重导向,从标准输入读取数据,输出到屏幕上,同时保存成文件。
格式:tee [-a] file
参数说明:
-a:以累加的方式,将数据加入到file中。
例如:ls -al /home | tee ~/myfile | more,将ls命令的数据存一份到myfile中,同时屏幕也有输出数据。
10、tr命令
命令说明:单个字符的处理工具,可以用于删除字符、替换字符等基本功能。更复杂的字符串处理工具通常使用sed。
格式:tr [-ds] SET1....
参数说明:
-d:删除,例如:cat file | tr -d ‘\r‘,相当于dos2unix命令所起的作用。
-s:替换字符,例如:cat file | tr -s [0-9],如果某个数字连续出现,仅保留第一个。
cat file | tr [a-z] [A-Z],将file中的小写字符全部改为大写。
11、col命令
命令说明:格式化显示列。
格式:col [-x]
参数说明:
-x:将tab键转换成对等的空格键;
例如:cat -A /etc/man.config | col -x | cat -A,使用cat -A,tab键会以^I显示,经过col -x处理,tab替换为空格。
12、expand命令
命令说明:将tab键转换成空格键。
格式:expand [-t] file
参数说明:
-t n:后面可以接一个数字n,一个tab键替换为n个空格键,默认值为8。
13、join命令
命令说明:处理两个文件中有相同数据的行,将它们加在一起。
格式:join [-ti12] file1 file2
参数说明:
-i:忽略大小写;
-t:分隔符,默认为空格符;
-1 m:指定file1用来比较的字段m,默认值为1;
-2 n:指定file2用来比较的字段n,默认值为1;
14、paste命令
命令说明:比较两个文件的数据关联性,直接将“两行贴在一起”,中间以tab键隔开。
格式:paste [-d] file1 file2
参数说明:
-d:后面接分隔符,默认为tab键。
15、diff命令
命令说明:以“行”为单位进行文件比较,一般用在ASCII纯文本文件。
格式:diff [-bBi] file1 file2
参数:
-b:忽略一行中有多个空白的差异;
-B:忽略空白行的不同;
-i:忽略大小写;
16、cmp命令
命令说明:以“位”为单位进行文件比较,可以比较二进制文件。
格式:cmp [-s] file1 file2
参数:
-s:将所有不同点的位都列出来,默认仅输出第一个发现的不同点;
17、patch命令
命令说明:diff old new > patch_file命令可以找出new文件与old文件不同的地方,然后用patch命令给old文件打上补丁,即与new文件相同了。
格式:patch -pN < patch_file
参数:-pN表示取消N层目录。
18、split命令
命令说明:将一个大文件拆分为几个小文件。
格式:split [-bl] fle
参数说明:
-b:拆分的文件大小,可加单位,如b, k, m等;
-l:按行数进行拆分;
例如:split -b 512k bigfile smallfile,将文件bigfile按512K拆分,拆分后的文件依次为:smallfileaa、smallfileab等。
split -l 10 bigfile smallfile,将文件bigfile中的每10行拆分成一个小文件。