Cut命令 ,主要用来提取各种各样的数据。
cut -cchars file
如:
-c5 提取第5个字符
-c5- 提取第5个字符以后的字符
-c1,5,12 提取多个字符,中间用“,”符号隔开
-c5-14 提取第5个字符到第14个字符间的字符
http://gan.cublog.cn
[service@dsg tmp]$ cat f.txt
service pts/0 Oct 9 20:27 (211.95.114.235)
service pts/1 Oct 9 21:06 (218.80.203.242)
service pts/2 Oct 9 14:35 (218.80.203.242)
service pts/3 Oct 9 21:07 (218.80.213.242)
service pts/4 Oct 9 21:07 (218.80.213.242)
service pts/5 Oct 9 21:45 (58.31.205.19)
[service@dsg tmp]$ cut -c5 f.txt
i
i
i
i
i
i
[service@dsg tmp]$ cut -c5- f.txt
ice pts/0 Oct 9 20:27 (211.95.114.235)
ice pts/1 Oct 9 21:06 (218.80.203.242)
ice pts/2 Oct 9 14:35 (218.80.203.242)
ice pts/3 Oct 9 21:07 (218.80.213.242)
ice pts/4 Oct 9 21:07 (218.80.213.242)
ice pts/5 Oct 9 21:45 (58.31.205.19)
[service@dsg tmp]$ cut -c1,5,14 f.txt
si0
si1
si2
si3
si4
si5
------------------------------
cut -d -f
-d, --delimiter=DELIM
use DELIM instead of TAB for field delimiter
-f, --fields=LIST
output only these fields; also print any line that contains no
delimiter character, unless the -s option is specified
-d -f 主要用来从某中分隔符中提取数据
如:
[service@dsg tmp]$ cat f.txt
service1:pts/0:Oct 9 20:27: (211.95.114.235)
service2:pts/1:Oct 9 21:06: (218.80.203.242)
service3:pts/2:Oct 9 14:35: (218.80.203.242)
service4:pts/3:Oct 9 21:07: (218.80.213.242)
service5:pts/4:Oct 9 21:07: (218.80.213.242)
service6:pts/5:Oct 9 21:45: (58.31.205.19)
[service@dsg tmp]$ cut -d: -f1 f.txt
service1
service2
service3
service4
service5
service6
[service@dsg tmp]$ cut -d: -f2 f.txt
pts/0
pts/1
pts/2
pts/3
pts/4
pts/5
[service@dsg tmp]$ cut -d: -f3 f.txt
Oct 9 20
Oct 9 21
Oct 9 14
Oct 9 21
Oct 9 21
Oct 9 21
[service@dsg tmp]$ cut -d: -f5 f.txt
(211.95.114.235)
(218.80.203.242)
(218.80.203.242)
(218.80.213.242)
(218.80.213.242)
(58.31.205.19)
[service@dsg tmp]$ cut -d: -f9 f.txt
[service@dsg tmp]$ cut -d: -f1,4 f.txt #提取1和4列数据
service1:27
service2:06
service3:35
service4:07
service5:07
service6:45
Given that the fields are separated by tabs, you should use the -f option to cut instead:
如果文件使用tab键隔开就直接使用-f就可以了,-d的默认分隔符号就为tab键。
############################################################################################
任务:
将日志中所有形如下的数据中大小为6141的行作处理,提取121212120_1.jpg的前8位后列表
-rw-r--r-- 1 root root 6141 Sep 8 10:39 /data1/mypic/temp/121212120_1.jpg
(1)提取数据行
tail -200000 /tmp/temp_move_video_images.log|grep " root "|grep " 6141 "
(2)提取 /data1/mypic/temp/121212120_1.jpg部分
tail -200000 /tmp/temp_move_video_images.log|grep " root "|grep " 6141 "|awk '{print $9}'
(3)提取121212120_1.jpg部分
tail -200000 /tmp/temp_move_video_images.log|grep " root "|grep " 6141 "|awk '{print $9}'|awk -F/ '{print $5}'
(4)提取12121212
tail -200000 /tmp/temp_move_video_images.log|grep " root "|grep " 6141 "|awk '{print $9}'|awk -F/ '{print $5}'|awk -F_ '{print $1}' |cut -c1-8
(5)排去重复项
tail -200000 /tmp/temp_move_video_images.log|grep " root "|grep " 6141 "|awk '{print $9}'|awk -F/ '{print $5}'|awk -F_ '{print $1}' |cut -c1-8|awk '{count[$1]++}END{for(name in count)print name,count[name] }' |awk '{print $1}'
Paste命令:
cut用来从文本文件或标准输出中抽取数据列或者域,然后再用paste可以将这些数据粘贴起来形成相关文件。
粘贴两个不同来源的数据时,首先需将其分类,并确保两个文件行数相同。paste将按行将不同文件行信息放在一行。缺省情况下, paste连接时,用空格或tab键分隔新行中不同文本,除非指定-d选项,它将成为域分隔符。
linux paste 命令详解
该命令主要用来将多个文件的内容合并,与cut命令完成的功能刚好相反。
功能说明:合并文件的列。
语 法:paste [-s][-d <间隔字符>][--help][--version][文件...]
补充说明:paste指令会把每个文件以列对列的方式,一列列地加以合并。
参 数:
-d<间隔字符>或--delimiters=<间隔字符> 用指定的间隔字符取代跳格字符。
-s或--serial 串列进行而非平行处理。
--help 在线帮助。
--version 显示帮助信息。
使用事例:
$ cat names
Tony
Emanuel
Lucy
Ralph
Fred
gan.cublog.cn
$ cat numbers
(307) 555-5356
(212) 555-3456
(212) 555-9959
(212) 555-7741
(212) 555-0040
$ paste names numbers 将两个文件合并,他们中间用tab键分隔开
Tony (307) 555-5356
Emanuel (212) 555-3456
Lucy (212) 555-9959
Ralph (212) 555-7741
Fred (212) 555-0040
gan.cublog.cn
$ cat addresses
55-23 Vine Street, Miami
39 University Place, New York
17 E. 25th Street, New York
38 Chauncey St., Bensonhurst
17 E. 25th Street, New York
gan.cublog.cn
$ paste names addresses numbers
Tony 55-23 Vine Street, Miami (307) 555-5356
Emanuel 39 University Place, New York (212) 555-3456
Lucy 17 E. 25th Street, New York (212) 555-9959
Ralph 38 Chauncey St., Bensonhurst (212) 555-7741
Fred 17 E. 25th Street, New York (212) 555-0040
$ paste -d'+' names addresses numbers 他们中间用指定的'+'符号隔开
Tony+55-23 Vine Street, Miami+(307) 555-5356
Emanuel+39 University Place, New York+(212) 555-3456
Lucy+17 E. 25th Street, New York+(212) 555-9959
Ralph+38 Chauncey St., Bensonhurst+(212) 555-7741
Fred+17 E. 25th Street, New York+(212) 555-0040
$ paste -s names 将多行数据合并到一行,他们间用tab键隔开
Tony Emanuel Lucy Ralph Fred
1 paste的拼凑原理是什么?
这个很简单,和cut的原理几乎一样,就是将几个文件的相应行用制表符连接起来,并输出到标准输出。
paste最简单的使用方法是:
[rocrocket@rocrocket programming]$ cat p1.txt
1 2 3 [ rocrocket@ rocrocket programming] $ cat p2.txt a b c [ rocrocket@ rocrocket programming] $ paste p1.txt p2.txt 1 a 2 b 3 c [ rocrocket@ rocrocket programming] $ paste p1.txt p2.txt|sed -n l 1 /ta$ 2 /tb$ 3 /tc$
看到制表符了吧,它就是默认的间隔符。
2 上面的例子是两个文件的,那三个文件呢?
当然也可以了。看看例子吧:
[ rocrocket@ rocrocket programming] $ cat p3.txt I II III [ rocrocket@ rocrocket programming] $ paste p1.txt p2.txt p3.txt 1 a I 2 b II 3 c III [ rocrocket@ rocrocket programming] $ paste p3.txt p2.txt p1.txt I a 1 II b 2 III c 3
可见paste的结果是和文件列表的顺序有关的。
3 我不想用制表符来间隔,我想用星号(*),可以么?
行的!使用-d符号就可以设定间隔符,这和cut没有两样。看看例子:
[ rocrocket@ rocrocket programming] $ paste -d '*' p3.txt p2.txt p1.txt I* a* 1 II* b* 2 III* c* 3
要注意一点,此处一定要把星号用引号括起来哦(单引号双引号均可),否则shell会把星号扩展为当前目录下的文件列表哦,小心小心。
4 我看过paste命令的man,里面提到了一个-s选项,我不懂是什么意思?
这个很好解释,继续上面的例子,看看这个命令:
[ rocrocket@ rocrocket programming] $ paste -s -d "*" p3.txt p2.txt p1.txt I* II* III a* b* c 1 * 2 * 3
呵呵,懂了吧,-s就是以每个文件为一个处理单元,将其中的所有行以-d设定的间隔符相连接组成一大行,输出到标准输出中。
3 Join命令:
功能说明:将两个文件中,指定栏位内容相同的行连接起来。
语 法:join [-i][-a<1或2>][-e<字符串>][-o<格式>] [-t<字符>][-v<1或2>][-1<栏位>][-2<栏位>][--help] [--version][文件1][文件2]
补充说明:找出两个文件中,指定栏位内容相同的行,并加以合并,再输出到标准输出设备。
参 数:
-a<1或2> 除了显示原来的输出内容之外,还显示指令文件中没有相同栏位的行。
-e<字符串> 若[文件1]与[文件2]中找不到指定的栏位,则在输出中填入选项中的字符串。
-i或--igore-case 比较栏位内容时,忽略大小写的差异。
-o<格式> 按照指定的格式来显示结果。
-t<字符> 使用栏位的分隔字符。
-v<1或2> 跟-a相同,但是只显示文件中没有相同栏位的行。
-1<栏位> 连接[文件1]指定的栏位。
-2<栏位> 连接[文件2]指定的栏位。
--help 显示帮助。
--version 显示版本信息。
范例1 : 将两个文件 内容相同的行连接起来
root@snail-hnlinux:~# cat test1 //显示文件test1 的内容
a 01
b 02
c 03
d 04
e 05
root@snail-hnlinux:~# cat test2 //显示文件test2 的内容
a xxx
b www
c jjj
d kkk
e lll
root@snail-hnlinux:~#
root@snail-hnlinux:~# join test1 test2 //连接两个文件
a 01 xxx
b 02 www
c 03 jjj
d 04 kkk
e 05 lll
root@snail-hnlinux:~# join test2 test1
a xxx 01
b www 02
c jjj 03
d kkk 04
e lll 05
root@snail-hnlinux:~#
4 tr命令:
1. tr 命令的功能
tr命名是简化了的sed命令。其主要的功能包括:
a. 用一个字符来替换另外一个字符。
b. 删除字符串中的指定子串。
c. 合并字符串中重复串。
2. 常见的命令格式:
tr -c -d -s ["string1_to_translate_from"] ["string2_to_translate_to"] < input-file
-c 用字符串1中字符集的补集替换此字符集,要求字符集为ASCII。
-d 删除字符串1中所有输入字符。
-s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。
input-file是转换文件名。虽然可以使用其他格式输入,但这种格式最常用。
指定字符串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
# cat file | tr [a-z] [A-Z] > new_file
# cat file | tr [A-Z] [a-z] > new_file
4、删除文件file中出现的"Snail"字符
或者
# cat file | tr -s "/r" "/n" > new_file