Linux开发环境及应用-第一周-文本文件的处理

介绍Linux中的文本信息,以及学习文本文件处理的相关命令。

Linux中的文本信息

主要分为以下几类:

  • C语言,Java语言等编程文件的源程序文本文件
  • 文本格式的数据文件
  • 文本格式的文字信息
  • 系统配置信息 如/etc下的配置文件
  • 程序的输出

文本型网络协议

因特网大部分传输层以上的协议是文本型协议

例如:

  • 会话层协议:HTTP,POP3,SMTP,IMAP
  • 表示层协议:HTML,XML,MIME,JSON

文本文件处理常用命令

可以使用重定向机制和管道机制,把多个命令组合使用。

Linux中的文本文件处理命令的特点:

  • 不指定处理对象文件名时,从标准输入获得数据
  • 指定处理对象文件名时。从文件中获取数据
  • 多数命令可以指定多个文件,常结合shell的文件通配符使用
  • 处理结果在标准输出显示

常用的文本文件处理命令有:

  • more/less:逐屏显示文件内容
  • cat、od:列出文件内容
  • head、tail:显示文件的头部、尾部
  • tee:三通
  • wc:字计数
  • sort:排序
  • tr:翻译字符(替换字符)
  • uniq:筛选重复行

more与less

more使用方法举例:

  • more shudu.c 指定一个文件
  • more *.[ch] 指定多个文件
  • ls -l | more 不指定文件,从标准输入获取,这里利用管道把ls -l的标准输出重定向到more的标准输入

输出满屏后,在more中使用的指令:

  • 空格 显示下一屏
  • 回车 向上滚一行,也就是把下一行滚动上来
  • q quit,退出程序
  • /pattern 根据正则表达式搜索字符串
  • / 继续查找要搜索的字符串
  • h help,帮助信息
  • Ctrl+L 屏幕刷新

less命令用法与more类似,增强的功能有:

  • 使用键盘的上下方向键,或者j,k键来滚动一行
  • 用PgUp和PgDn按键翻页
  • 用Home键翻到第一页,或者用End键翻到最后一页

more和less都可以同时处理多个文件

cat与od

cat命名来源于英文concatenate——串结,查字典查到意思是“把 (一系列事件、事情等)联系起来”。这个命令用于打印文件内容,选项-n可以显示行号。

od octal dump 逐字节打印。常用选项有:

  • -c 按照字符打印,如果这个字节为ascii码就显示为对应的字符,字符如果不可打印就显示为八进制码
  • -t c 同-c选项
  • -t x1 每一字节不可见字符显示为十六进制码
  • -t d1 每一字节不可见字符显示为十进制码
  • -t u1 每一字节不可见字符显示为无符号的十进制码

cat和od命令都可以同时处理多个文件

head与tail

head显示文件内容前10行,tail显示文件内容最后10行,-n选项可以指定显示的行数。

一些用法:

  • head -n 15 ab.c 显示文件ab.c的前15行
  • head -n -20 msg.c 除了文件msg.c尾部20行,显示其余部分
  • tail -n +20 msg.c 除了文件msg.c头部20行,显示其余部分
  • tail -f debug.txt 实时打印文件尾部被追加的内容

head和tail命令都可以同时处理多个文件

tee

tee命令将从标准输入得到的数据抄送到标准输出显示,与此同时,把数据存入磁盘文件中,也可以同时写入多个文件。

用法举例:

1
$ vim 1.txt | tee /dev/pts/1

/dev/pts/1是一个终端设备文件,这条命令使用vim编辑文件1.txt,并同时显示在/dev/pts/1终端的屏幕上。

wc

wc命令的功能主要是统计文件行数,单词数,字符数。

文件shudu.c有240行,576个单词,5264个字符:

1
2
$ wc shudu.c 
240 576 5264 shudu.c

使用选项-l,只列出行数:

1
2
$ wc -l shudu.c
240 shudu.c

当同时处理多个文件的时候,还列出一个合计:

1
2
3
4
$ wc shudu.c arg.c 
240 576 5264 shudu.c
9 24 153 arg.c
249 600 5417 total

结合管道和ps命令,查看系统所有进程的个数

1
2
$ ps -ef | wc -l
166

sort

sort命令按照字符串排序,每一行为一个字符串,默认为升序。

文件test.txt内容是:

1
2
3
4
5
6
$ cat test.txt 
aasd
zxcaw
456
1234
as

用sort排序:

1
2
3
4
5
6
$ sort test.txt   
1234
456
aasd
as
zxcaw

使用-n选项,对数字按照算术值大小排序,而不是按照字符串比较规则排序。

1
2
3
4
5
6
$ sort test.txt -n
aasd
as
zxcaw
456
1234

更多选项可以用man命令查看

tr

基本用法:tr string1 string2 把标准输入拷贝到标准输出,string1中出现的字符替换为string2中的对应字符。

把前面提到的test.txt文件中的字符转换成大写:

1
2
3
4
5
6
$ cat test.txt | tr axcwdzs 'AXCWDZS'
AASD
ZXCAW
456
1234
AS

或者直接使用[]指定一个集合:

1
2
3
4
5
6
$ cat test.txt | tr '[a-z]' '[A-Z]'
AASD
ZXCAW
456
1234
AS

可以用\加一个八进制数值来表示一个字符,下面是把字符1换成换行符(\012

1
2
3
4
5
6
7
$ cat test.txt | tr '1' '\012'    
aasd
zxcaw
456

234
as

uniq

uniq命令用与筛选文件中重复的行,重复的行是指连续的相同的行。

与大部分命令不同,这个命令最多指定两个文件,第一个文件为输入文件,第二个文件为输出文件。

现有name.txt文件,内容如下:

1
2
3
4
5
6
7
$ cat name.txt 
feather
feather
Lee
lee
feather
Linux

不带选项运行uniq命令,打印没有重复的行和有重复的行,重复的行只打印一次

1
2
3
4
5
6
$ uniq name.txt 
feather
Lee
lee
feather
Linux

使用-u (uniqe)选项,打印没有重复的行

1
2
3
4
5
$ uniq -u name.txt 
Lee
lee
feather
Linux

使用-d (duplicated)选项,打印有重复的行,重复的行只打印一次

1
2
$ uniq -d name.txt
feather

使用-c选项,统计每行的重复次数

1
2
3
4
5
6
$ uniq -c name.txt  
2 feather
1 Lee
1 lee
1 feather
1 Linux

注意:重复的行是指连续的相同的