Linux中常用命令之一——文本处理

来源:互联网 发布:网络推广人员职责 编辑:程序博客网 时间:2024/06/08 12:19
转载,再加上自己添加一些。再整理一次当加强记忆

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 pathname -options [-print -exec -ok] 
-pathname :find命令所查找的目录路径。如用"."来表示当前的目录,用/来表示系统根目录 

-print :find命令将匹配的文件输出到标准输出 


-exec: find命令对匹配的文件执行该参数所给出的shell命令,相应的命令形式为 

'command'{} \;(注意{}和\之间的空格) 
find . -type f -exec ls -l {} \; 查找当前目录下是否有普通文件,若有则执行ls -l 


-ok 和 -exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。 

options有如下几种: 
    -name :按照文件名查找文件 
    -perm :按照文件权限来查找文件 
    -user :按照文件属主来查找文件 
    -group :按照文件所属的组来查找文件 
    -mtime -n +n 按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。find命令还有-atime 和-ctime选项,但它们都和-mtime选项相似。 
    -size n[c]查找文件长度为n块的文件,带有c时表示文件长度以字节计。 
    -nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在 
    -newer file1 !file2查找更改时间比文件file1新但比文件file2旧的文件 
    -depth 先查找指定目录有无匹配文件,若无则再在子目录中查找 
    -type 查找某一类型的文件,如 
      b :块设备文件 
      d:目录 
      e:字符设备文件 
      p;管道文件 
      l:符号链接文件 
      f:普通文件 


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个字段;$0为所有域
NF:每一行拥有的字段总数;
NR:当前行的行号;
FS:分隔符,默认为空格键;


模式部分决定动作语句何时触发及触发事件。(BEGIN,END)
动作对数据进行处理,放在{}内指明(print)

例如:

cat /etc/passwd | awk 'BEGIN {FS=":"} $S3<10 {print $1 "\t" $3}',打印passwd文件第三栏小于10的行的第1、3栏。

awk 'BEGIN {print "IPDate\n"}{print $1 "\t" $4} END{print "end-of-report"}' test.txt
开始时打印“IPDate”结束时打印“end-of-report”中间打印主体信息,比如总共匹配三条信息,则输出如下:
IPDate
1 first
2 second
3 third
end-of-report 

(4)匹配操作符 ~ 匹配,!~ 不匹配
cat test.txt |awk '$0~/210.34.0.13/' 匹配test.txt中为210.34.0.13的行
awk '$0!~/210.34.0.13' test.txt 匹配test.txt中不是210.34.0.13的行
awk '{if($1=="210.34.0.13") print $0}' test.txt 匹配 test.txt中第一个域为210.34.0.13的行。



5、sed工具

命令说明: sed不与初始化文件打交道,它操作的只是一个拷贝,然后所有的改动如果没有重定向到一个文件,将输出到屏幕。 

文本过滤工具,使用一行命令或者使用管道与grep与awk相结合

格式:sed [-nefr] 动作
参数说明:
-n:安静模式,仅显示经过sed特殊处理的行;
-e:直接在命令行模式进行sed的操作编辑;
-f file:将sed操作写在一个文件中;

-r:支持扩展正则表达式语法;

(1)调用sed的三种方式
使用sed命令行格式为:sed [options] sed命令 输入文件
使用sed脚本文件格式为:sed[options] -f sed脚本文件 输入文件
sed脚本文件[options] 输入文件
--不管是使用shell命令行方式或脚本文件方式,如果没有指定输入文件,sed从标准输入中接受输入,一般是键盘或重定向结果。

(2)读取文本的方式
x x为一行号
x,y 表示行号范围从x到y
/pattern/ 查询包含模式的行
/pattern/pattern/ 查询包含两个模式的行
pattern/,x 在给定的行号上查询包含模式的行
x,/pattern/ 通过行号和模式查询匹配行
x,y! 查询不包含指定行号x和y的行

动作说明:[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。

g 将模式2粘贴到/pattern n/ 

sed 's/good/good morning/g' test.txt 匹配good并替换成goodmorning
sed 's/good/& hello /p' test.txt 匹配到good就在其后面加上hello
sed 's/good/ hello &/p' test.txt 匹配到good就在其前面加上hello


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以第三栏排序。

sort -u test.txt 排序并合并一样的行,即uniq


7、uniq命令
命令说明:和sort搭配,如果排序完成了,将重复的行仅显示一次。注意,若文件未排序,该命令失效
格式:uniq [-ic]
参数说明:
-i:忽略大小写;
-c:统计每行重复的次数;
-f :n为数字,前n个域被忽略

uniq -f 2 test.txt 忽略前2个域



8、wc命令

命令说明:统计文本文件中有多少字,多少行,多少字符。
格式:wc [-lwm]
参数说明:
-l:仅显示行数;
-w:仅显示字数(英文单词个数);
-m:字符数;

9、tee命令

命令说明:双向重导向,从标准输入读取数据,输出到屏幕上,同时保存成文件。
格式:tee [-a] file
参数说明:
-a:以追加的方式,将数据加入到file中。

例如:

ls -al /home | tee ~/myfile | more,将ls命令的数据存一份到myfile中,同时屏幕也有输出数据。

who | tee who.out     


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中的小写字符全部改为大写。                                


删除文件file中出现的"Snail"字符
# cat file | tr -d "Snail" > new_file
【注意】这里,凡是在file文件中出现的'S','n','a','i','l'字符都会被删除!而不是紧紧删除出现的"Snail”字符串。

删除文件file中出现的换行'\n'、制表'\t'字符
# cat file | tr -d "\n\t" > new_file
不可见字符都得用转义字符来表示的,这个都是统一的。


删除“连续着的”重复字母,只保留第一个 -s
# cat file | tr -s [a-zA-Z] > new_file

删除空行
# cat file | tr -s "\n" > new_file

删除Windows文件“造成”的'^M'字符
# cat file | tr -d "\r" > new_file
或者# cat file | tr -s "\r" "\n" > new_file

【注意】这里-s后面是两个参数"\r"和"\n",用后者替换前者

'\r'是回车,'\n'是换行,前者使光标到行首,后者使光标下移一格。通常用的Enter是两个加起来。

c语言编程时(windows系统)\r 就是return 回到 本行 行首 这就会把这一行以前的输出 覆盖掉
如:
int main()

 {
cout << "hahaha" << "\r" << "xixi" ;
}
最后只显示 xixi 而 hahaha 被覆盖了
\n 是回车+换行 把光标 先移到 行首 然后换到下一行 也就是 下一行的行首拉
int main()

 {
cout << "hahaha" << "\n" << "xixi" ;
}
则 显示
hahaha
xixi


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;

file1:
1 aaaaaaaa
2 bbbbbbbb
3 cccccccccc
file2:
1 1111111111
2 2222222222
1.将两个文件 内容相同的行连接起来
$join file1 file2
1 aaaaaaaa 1111111111
2 bbbbbbbb 2222222222

14、paste命令
命令说明:比较两个文件的数据关联性,直接将“两行贴在一起”,中间以tab键隔开。
格式:paste [-d] file1 file2
参数说明:
-d:后面接分隔符,默认为tab键。


15、diff命令

命令说明:以“行”为单位进行文件比较,一般用在ASCII纯文本文件。
格式:diff [-bBi] file1 file2
参数:
-b:忽略一行中有多个空白的差异;
-B:忽略空白行的不同;
-i:忽略大小写;

程序清单1 :hello.c
#include
int main(void)
{
char msg[] = "Hello world!";

puts(msg);
printf("Welcome to use diff commond.\n");

return 0;
}
程序清单2:hello_diff.c
#include
#include
int main(void)
{
char msg[] = "Hello world,fome hello_diff.c";

puts(msg);
printf("hello_diff.c says,'Here you are,using diff.'\n");

return 0;
}
我们使用diff命令来查看这两个文件的不同之处,有一下几种方便的方法:
1、普通格式输出:
[root@localhost diff]# diff hello.c hello_diff.c
1a2
> #include
5c6
char msg[] = "Hello world,fome hello_diff.c";
8c9
printf("hello_diff.c says,'Here you are,using diff.'\n");
[root@localhost diff]#
上面的“1a2”表示后面的一个文件"hello_diff.c"比前面的一个文件"hello.c"多了一行

"5c6"表示第一个文件的第5行与第二个文件的第6行有区别


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 n,每个分割文件的大小n, 可加单位,如b, k, m等;

-C n,每个分割文件一行最多n字节
-l n,每个分割文件的行数
-n,同-l n

例如:split -b 512k bigfile smallfile,将文件bigfile按512K拆分,拆分后的文件依次为:smallfileaa、smallfileab等。
split -l 10 bigfile smallfile,将文件bigfile中的每10行拆分成一个小文件。

19、xargs命令

用途
构造参数列表并运行命令。大多数 Linux 命令都会产生输出:文件列表、字符串列表等。但如果要使用其他某个命令并将前一个命令的输出作为参数该怎么办?
file -Lz * | grep ASCII | cut -d":" -f1 | xargs ls -ltr

让我们来剖析这个命令字符串。

第一个,file -Lz *,用于查找是符号链接或者经过压缩的文件。它将输出传递给下一个命令 grep ASCII,该命令在其中搜索 "ASCII" 字符串并产生如下所示的输出: alert_DBA102.log: ASCII English text

alert_DBA102.log.Z: ASCII text (compress'd data 16 bits)

dba102_asmb_12307.trc.Z: ASCII English text (compress'd data 16 bits)

dba102_asmb_20653.trc.Z: ASCII English text (compress'd data 16 bits)

由于我们只对文件名感兴趣,因此我们应用下一个命令 cut -d":" -f1,仅显示第一个字段:

alert_DBA102.log

alert_DBA102.log.Z

dba102_asmb_12307.trc.Z

dba102_asmb_20653.trc.Z

现在,我们希望使用 ls -l 命令,将上述列表作为参数进行传递,一次传递一个。xargs 命令允许您这样做。最后一部分,xargs ls -ltr,用于接收输出并对其执行 ls -ltr 命令,如下所示:

ls -ltr alert_DBA102.log

ls -ltr alert_DBA102.log.Z

ls -ltr dba102_asmb_12307.trc.Z

ls -ltr dba102_asmb_20653.trc.Z

因此,xargs 本身虽然没有多大用处,但在与其他命令相结合时,它的功能非常强大。

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行拆分成一个小文件。

19、xargs命令


0 0