1. 字段处理
由于UNIX 鼓励使用文本型数据,因此系统上最常见的数据存储类型就是文本了,在文本文件下,一行表示一条记录。这里要介绍的是在一行内用来分隔字段的两种惯例。首先是直接使用空白(whitespace ) ,也就是用空格键(space) 或制表(tab) 键:
[root@local~]cat myapp.data
#model units sold salesperson
xjll 23 bane
rj45 12 doe
cat6 65 Chris
本例中,# 字符起始的行表示注释,可忽略( 这是一般的习惯,注释行的功能相当好用, 不过软件必须可忽略这样的行才行) 。各字段都以任意长度的空格(space) 或制表(Tab) 字符隔开。第二种惯例是使用特定的定界符来分隔字段,例如冒号:
[root@local~]cat myapp.data
#model:units sold:salesperson
xjll:23:Jane
rj45:12:joe
cat6:65:Chris
两种惯例都有其优缺点。使用空白作为分隔时,字段内容就最好不要有空白( 若你使用制表字符(Tab) 作分隔,字段里有空格是不会有问题的,但这么做视觉上会混淆,因为你在看文件时,很难马上分辨出它们的不同) 。反过来说,若你使用显式的定界符,那么该定界符也最好不要成为数据内容。
2. cut
2.1. c ut 命令格式
2.1.1 . cut 命令语法
cut –c list [file … ]
cut –f list [–d delim] [file … ]
2.1.2 .cut 命令的参数
-d : 后接分隔符,与-f 一起使用。
-f : 根据分隔符将一条记录分成数段。
-c :以字符为单位取出固定的字符范围。
2.2. c ut 命令的例子
1. 将PATH 变量取出,找出第三个路径
[root@local~]# echo $PATH
/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/root/bin:/usr/games
[root@local~]# echo $PATH | cut –d ‘:’ -f 5
/usr/local/bin
2. 承上题,找出第三个和第五个路径
[root@local~]# echo $PATH | cut –d ‘:’ -f 3,5
/sbin /usr/local/bin
3. 将export 输出的稍息,取出地12 个字符以后的所有宇将申
[root@local~]#export
declare -x HISTSIZE>"100D"
declare -x INPUTRC="/etc/inputrc"
declace -x KDEDIR="/uar"
其他省略
[root@local~]#export | cut –c 12-
HISTSIZE>"100D"
INPUTRC="/etc/inputrc"
KDEDIR="/uar"
其他省略
3. join
3.1. join 命令格式
3.1.1 . join 命令语法
join –c [option … ] file1 file2
3.1.2 . join 命令的参数
-t : join 默认以空格符分隔数据,并且比较“第一个字段“的数据。如果两个文件相同,则将两个数据连成一行,且第一个字段放在第一个
-i : 忽略大小写。
-1 :这个是数字1 ,表示“第一个文件要用那个字段来分析“的意思。
-2 : 表示“第二个文件要用那个字段来分析“的意思。
3.2. join 命令的例子
1. 将/etc/passwd 和/etc/shadow 相关数据整合在一起
[root@local~]# join –t ‘:’/etc/passwd /etc/shadow
bin:x:1:1:bin:/bin:/sbin/nologin:*:12959:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:12959:0:99999:7:::
admin:x:3:4:admin:/var/admin:/sbin/nologin:*:12959:0:99999:7:::
2. 将/etc/passwd 第四个字段GID 和/etc/group 第三个字段相关数据整合在一起
[root@local~]# join –t ‘:’-1 4 /etc/passwd -2 3 /etc/group
0:root:x:0:root:/root:/bin/bash:root:x:
1:bin:x:1:bin:/bin:/sbin/nologin:bin:x:root,bin,daemon
2:daemon:x:2:daemon:/sbin:/sbin/nologin:daemon:x:root,bin,daemon
4:admin:x:3:admin:/var/admin:/sbin/nologin:admin:x:root,admin,daemon
# 原来/etc/passwd 第一行的内容如下:
root:x:0:0:root:/root:/bin/bash
# 原来/etc/group 第一行的内容如下:
root:x:0:
# 第一个文件的第四栏和第二个文件的第三栏取出放在了最前面
4. awk
4.1. awk 命令格式
4.1.1 . awk 命令语法
awk [-F fs] [-v var=value …] ‘program’ [- -] [var=vaule][file(s)]
awk [-F fs] [-v var=value …] –f programfile [- -] [var=vaule] [file(s)]
4.1.2 . awk 命令的参数
-- : 是特殊选项,指出awk 本身已没有更进一步的命令行选项。
-F : 用来重新定义默认字段分隔符
-v :必须放在命令行上直接给定的任何程序之前,它们会在程序启动之前以及处理任何文件之前生效。
-f :指定程序从文件读入。
4.2. awk 常用内建标量变量
变量 | 说明 |
FILENAME | 当前输入文件的名称 |
FNR | 当前输入文件的记录数 |
FS | 字段分隔符 ( 正则表达式 ) ( 默认“ “ ) |
NF | 当前记录的字段数 |
NR | 在工作中的记录数 |
OFS | 输出字段分隔字符 ( 默认“ “ ) |
ORS | 输出记录分隔字符 ( 默认“ /n “ ) |
RS | 输入记录分隔符 ( 默认“ /n “ ) |
4.3. awk 命令的例子
1. 打印/etc/passwd 的第一个字段和最后一个字段
[root@local~]# awk –F :‘{ print $1,$NF}’
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
admin /sbin/nologin
2. 打印/etc/passwd 第一个和第后一个字段中间以** 分隔
[root@local~]# awk –F :-v ‘OFS=** ’‘{ print $1,$5}’
root**/bin/bash
bin**/sbin/nologin
daemon**/sbin/nologin
admin**/sbin/nologin