bash 文件处理操作工具总结

bash 文件处理操作工具总结

1 常用过滤器
1.1 tr
可以把tr看成是sed的一个简化版本,它可以用一个字符来替换另一个字符,或者去除一些字符。也可以用来去除重复字符。tr主要用于删除文件中控制字符或进行字符转换。语法:
tr -c -d -s ["string1_to_translate_from"] ["string2_to_translate_to"] < input-file>
-c 用字符串1中字符集的补集替换此字符集,要求字符集为ASCII。
-d 删除字符串1中所有输入字符。
-s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。
字符范围
指定字符串1或字符串2的内容时,只能使用单字符或字符串范围或列表。
[a-z] a-z内的字符组成的字符串。
[A-Z] A-Z内的字符组成的字符串。
[0-9] 数字串。
octal 一个三位的八进制数,对应有效的ASCII字符。
[O*n] 表示字符O重复出现指定次数n。因此[O*2]匹配OO的字符串。
tr中特定控制字符的不同表达方式
速记符含义八进制方式
a Ctrl-G 铃声07
b Ctrl-H 退格符10
f Ctrl-L 走行换页14
n Ctrl-J 新行12
r Ctrl-M 回车15
t Ctrl-I tab键11
v Ctrl-X 30
例1:删除文件中重复的小写字母,双引号是必须的
[root@redhat test]# cat new
aaabbbZZZBBBcccDDD
abcabcabcAABBCC
[root@redhat test]# cat new|tr -s "[a-z]"
abZZZBBBcDDD
abcabcabcAABBCC

例2:删除空行
[root@redhat test]# cat new
aaabbbZZZBBBcccDDD

abcabcabcAABBCC
[root@redhat test]# tr -s "[12]"<new
aaabbbZZZBBBcccDDD
abcabcabcAABBCC

例3:将大写转成小写
[root@redhat test]# tr "[A-Z]" "[a-z]"<new
aaabbbzzzbbbcccddd

abcabcabcaabbcc

例4:将字母以外的字符转换成新行,并删除重复的
[root@redhat test]# cat new
aa1ab3bbZ4ZZB5B676BcccDDD
567456234234
23423425
abcabcabcAABBCC
[root@redhat test]# tr -cs "[A-Za-z]" "[n*]"<new
aa
ab
bbZ
ZZB
B
BcccDDD
abcabcabcAABBCC
如果把-s去掉重复行去掉,就会成这个样子
[root@redhat test]# tr -c "[A-Za-z]" "[n*]"<new
aa
ab
bbZ
ZZB
B

BcccDDD

abcabcabcAABBCC

例5:把/etc/passwd中的:换成TAB
[root@redhat test]# tr "[:]" "t" </etc/passwd
root x 0 0 root /root /bin/bash
bin x 1 1 bin /bin /sbin/nologin
daemon x 2 2 daemon /sbin /sbin/nologin
adm x 3 4 adm /var/adm /sbin/nologin
lp x 4 7 lp /var/spool/lpd /sbin/nologin
sync x 5 0 sync /sbin /bin/sync
…..

例6:使内容更具可读性
[root@redhat test]# echo $PATH | tr ":" "n"
/usr/local/sbin
/usr/local/bin
/sbin
/bin
/usr/sbin
/usr/bin
/usr/X11R6/bin
/root/bin
/root/Testsh

例7:在vi 中使用
1,$!tr -d 'a'

1.2 wc 显示行数,单词数,字节数,字符数
参数:
–byte    -c  仅仅显示输入中的字节数
–lines    -l  仅仅显示输入中的行数
–max-line-length  -L  显示输入中最长的行的长度
–chars    -m  仅仅显示输入中的字符数
–words    -w  仅仅显示输入中的单词数
一个单词是指由空格,TAB,换行或它们的混合分隔限定的一系列字符。
1.3 uniq 显示唯一的行
语法:uniq [options][input-file][output-lile]
–count  -c  在行首显示该行在输入文件中出现的次数
–repeated  -d  显示一次重复出现的行,不显示没有重复出现的行
–skip-fields=nfield    -f nfield  忽略每行的前n个邮空白字符分隔出的字段
–ignore-case  -i  比较行时忽略字符大小写
–skip-chars=nchar    -s nchar  忽略每行的前n个字符。如果同时使用了–skip-nfields选项,uniq将忽略行首的n个字段以及它们后面的n个字符。可以使用该选项来忽略字段打头的空白字符
–unique  -u  仅显示那些没有重复出现的行
–check-chars=nchar  -w nchar  在应用-f 与-s选项之后,一共比较行中n个字符。默认情况下uniq将比较整行。
例:
[root@redhat test]# cat 98
i am zb
i am zb
i am zb
fuck you
he is sb
he is sb
he is sb
he is sb
he is sb
he is sb
he is sb
[root@redhat test]# uniq 98
i am zb
fuck you
he is sb
#去掉重复出现的行
[root@redhat test]# uniq -d 98
i am zb
he is sb
#显示一次重复出现的行,没重复的不显示
[root@redhat test]# uniq -u 98
fuck you
#仅显示不重复的行
[root@redhat test]# uniq -c 98
3 i am zb
1 fuck you
7 he is sb
#只显示一次重复出现的行,并统计出数次数

1.4  grep 在文件中搜索模式
语法:grep [options] pattern [file-list]
主要选项
-E  可使用扩展正则表达式与egrep相同
-F  解释为固定的字符串,与fgrep同
-G  解释为基本正则表达式。默认值
其它选项
–count  -c  只显示每个文件中包含匹配的行的数目
–context    -Cn  对每个匹配的行显示n行上下文
–file=file    -f file  该文件中每行都包含一个模式,从输入中找匹配每个模式的行
–no-filename    -h  当搜索多个文件时,在每行的开始不显示文件名
–ignore-case  -i  忽略大小写
–files-with-matches  -l  仅显示包含匹配的文件名,仅显示一次
–max-count=n  -m n    显示包含匹配的n行后停止读取文件或标准输入
–line-number    -n  在显示的每行前显示行号
–quiet  -q  不发送任何内容到标准输出,仅设置退出代码
–recursive  -r或-R  递归处理目录中的所有文件
–no-message    -s  如果文件不存在或不可读,不显示错误消息
–invert-match    -v  显示不包含匹配的行,反选
–word-regxp    -w  必须匹配整个字
–line-regxp    -x  必须匹配整行

1.5 sort 对文件排序或合并
语法:sort [options][file-list]
-b  忽略行开头的空格或TAB
-c  检查文件是否被恰当地排序。如以已排好则不显示任何消息,否则返回退出状态为1
-d  忽略除字母数字和空白符外的所有其他字符。例如标点符号
-f  将所有小写字母看作是大写字母进行比较。
-i  忽略所有的非打印字符
-k start[,stop]  按指定的排序字段进行排序
-m  如输入多个文件,不检查文件是否排好序而直接将它们全并起来
-n  按算术序列排序
-o filename  将输出发送到filename,filename可以是file-li

st中某个文件
-r  按逆序排列
-t x  指定字段分隔符为x
-u  对重复行仅输出一次
例1:
[root@redhat Testsh]# cat cars
plym fury 1970 73 2500
chevy malibu 1990 60 3000
ford mustang 1965 45 10000
volvo s80 1998 102 9850
ford thundbd 2003 15 10500
chevy malibu 2000 50 3500
bmw 325i 1985 115 450
honda accord 2001 30 6000
ford taurus 2004 10 17000
toyota rav4 2002 180 750
chevy impata 1985 85 1550
ford explor 2003 25 9500
[root@redhat Testsh]# sort -n -k5 cars
bmw 325i 1985 115 450
toyota rav4 2002 180 750
chevy impata 1985 85 1550
plym fury 1970 73 2500
chevy malibu 1990 60 3000
chevy malibu 2000 50 3500
honda accord 2001 30 6000
ford explor 2003 25 9500
volvo s80 1998 102 9850
ford mustang 1965 45 10000
ford thundbd 2003 15 10500
ford taurus 2004 10 17000
按数字方式给第5个字段从小到大排序

例2:
[root@redhat Testsh]# sort -t ":" -k3 -nr /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
root5:x:559:0:shashijie:/home/root:/bin/bash
root4:x:558:0:shashijie:/home/root:/bin/bash
root3:x:557:0:shashijie:/home/root:/bin/bash
root2:x:556:0:shashijie:/home/root:/bin/bash
root1:x:555:0:shashijie:/home/root:/bin/bash
ssj5:x:554:554:shashijie:/home/ssj:/bin/bash
ssj4:x:553:553:shashijie:/home/ssj:/bin/bash
ssj3:x:552:552:shashijie:/home/ssj:/bin/bash
ssj2:x:551:551:shashijie:/home/ssj:/bin/bash
ssj1:x:550:550:what,beijing,12345678,123123:/home/ssj:/bin/bash
test1:x:501:501:testmod:/home/test1:/bin/bash
ssj:x:500:500:shashijie:/home/ssj:/bin/bash
nobody:x:99:99:Nobody:/:/sbin/nologin
desktop:x:80:80:desktop:/var/lib/menu/kde:/sbin/nologin
pcap:x:77:77::/var/arpwatch:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
webalizer:x:67:67:Webalizer:/var/www/html/usage:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin
gdm:x:42:42::/var/gdm:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
rpm:x:37:37::/var/lib/rpm:/bin/bash
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash
named:x:25:25:Named:/var/named:/sbin/nologin
squid:x:23:23::/var/spool/squid:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
news:x:9:13:news:/etc/news:
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sync:x:5:0:sync:/sbin:/bin/sync
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
以:为分隔符,按数字的方式给第3个字段进行反向排序(从大到小)

例3:
[root@redhat Testsh]# sort -nb -k3.2 cars
chevy malibu 2000 50 3500
honda accord 2001 30 6000
toyota rav4 2002 180 750
ford explor 2003 25 9500
ford thundbd 2003 15 10500
ford taurus 2004 10 17000
ford mustang 1965 45 10000
plym fury 1970 73 2500
bmw 325i 1985 115 450
chevy impata 1985 85 1550
chevy malibu 1990 60 3000
volvo s80 1998 102 9850
以数字方式(-n)忽略之前的空字符(-b),从第3 个字段的第2个字符开始排序

例4:
[root@redhat Testsh]# sort -b -k5n -k1f cars
bmw 325i 1985 115 450
toyota rav4 2002 180 750
chevy impata 1985 85 1550
plym fury 1970 73 2500
chevy malibu 1990 60 3000
chevy malibu 2000 50 3500
honda accord 2001 30 6000
ford explor 2003 25 9500
volvo s80 1998 102 9850
ford mustang 1965 45 10000
ford thundbd 2003 15 10500
ford taurus 2004 10 17000
忽略前边的空字符,按第5个字段数字方法进行排序如果相同则再按第1个字段排序并不区分大小写

例5:
[root@redhat Testsh]# sort -b -k3,3 -k1 cars
ford mustang 1965 45 10000
plym fury 1970 73 2500
bmw 325i 1985 115 450
chevy impata 1985 85 1550
chevy malibu 1990 60 3000
volvo s80 1998 102 9850
chevy malibu 2000 50 3500
honda accord 2001 30 6000
toyota rav4 2002 180 750
ford explor 2003 25 9500
ford thundbd 2003 15 10500
ford taurus 2004 10 17000
忽略空字符,从第3 个字段的第1个字符开始到第3 个字段尾进行排序,如相同再按字段1 进行排序,如果不指定k3,3的末尾,将会比较从第3个字段到行的结束,则不会有相同的行,就不会进行第二次的排序。

注意:同时使用-u 与-f时有时会丢失行所以最好这样用
sort -u -k 1f -k 1 test

1.6 split 将文件分成几部分
语法:split [options][filename[prefix]]
-a len  指定创建文件名后缀的长度为len个字符。默认为2
-b n[u]  将输入分成n个字节长的几个文件。u为可选的单位 b,k,m
-l num  将输入分解为具有num行长的文件。默认为1000
split -b 200 cars

1.7 sed
http://www.kumouse.com/article.asp?id=106

1.8 gawk
http://www.kumouse.com/article.asp?id=104

1.9 aspell

1.10 cmp 比较两个文件

1.11 comm 比较经以排序的文件

1.12 cpio

1.13 cut 从输入行中选取字符或者字段
语法:cut [options][file-list]
-c clist    选取由clist中的列号指定的字符。(各值用,分隔。列范图用-n,n-,n-m来表示)
-d dchar    将dchar作为输入字段的分隔符。默认为TAB.
-f flist    选择flist指定的字段。
–output-delimiter=ochar    将ochar指定为输出字段分隔符。
例1:
[root@redhat Testsh]# ll |cut -c57-90|grep ^[a-zA-Z]
apue2.zip
awk_glarr
awk_if
awk_out
awk_t
awk_t1
cars
Fibonacci_recursive.sh
Fibonacci_while.sh
find_uid
fordfile
if.ak
manuf
Recursive.sh
report
text.txt
tmp.sh
word_usage
xaa
xab
xac
xad
显示第57-90列,并去除空白的行

1.14 diff 比较两个文件的不同

1.15 fmt 简单地格式化文本
语法:fmt [options][file-list]
-s  截断长行但不填充短行
-t  除每个段落第1行外,都缩进
-u  改变格式化输出使得字之间为一个空格,句子之间为两个空格
-w n  将输出的行宽度改为n个字符。不带该

选项,fmt输出行宽度为75个字符
例:fmt -w 50 memo
将文件memo的宽度改为50字符,并输入到标准输出

1.16 od 根据指定的格式输出文件内容 648

1.17 paste 将文件对应行连接起来
语法:paste[option][file-list]
-d dlist  dlist是用来分隔输出字段的字符列表。如果仅有一个字符,paste将使用该字符替换TAB作为字段分隔符,如包含多个字符,这些字符轮流使用。
-s  一次处理一个文件,水平连接。

1.17 pr 给文件标明页码,以供打印 654

1.18 strings 显示可打印字符串

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注