现在的位置: 首页 > 综合 > 正文

shell实现字段处理详解

2014年01月20日 ⁄ 综合 ⁄ 共 2929字 ⁄ 字号 评论关闭

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

cut –f list [–d delim]

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]

awk [-F fs] [-v var=value …] –f programfile  [- -]  [var=vaule]

 

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

抱歉!评论已关闭.