【转帖】Linux Cut 命令 与 Paste命令&Join命令&tr命令

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

 

tr是Unix系统非常实用的工具,其实用tr做到的事情,几乎都可用sed做到,你可以把tr当作是实现sed许多基本功能的sed“简体”。我认为tr是简单的“字符”处理工具,而sed是功能非常强大的“字符串”处理工具。
【注意】tr是单个字符处理工具,而不是字符串处理工具!
我自己用过比较实用的例子如下:
1、将文件file中出现的"abc"替换为"xyz"
# cat file | tr "abc" "xyz" > new_file
【注意】这里,凡是在file中出现的"a"字母,都替换成"x"字母,"b"字母替换为"y"字母,"c"字母替换为"z"字母。而不是将字符串"abc"替换为字符串"xyz"。
2、使用tr命令“统一”字母大小写
(小写 --> 大写)
# cat file | tr [a-z] [A-Z] > new_file
(大写 --> 小写)
# cat file | tr [A-Z] [a-z] > new_file
3、把文件中的数字0-9替换为a-j
# cat file | tr [0-9] [a-j] > new_file

4、删除文件file中出现的"Snail"字符
# cat file | tr -d "Snail" > new_file
【注意】这里,凡是在file文件中出现的'S','n','a','i','l'字符都会被删除!而不是紧紧删除出现的"Snail”字符串。
5、删除文件file中出现的换行'/n'、制表'/t'字符
# cat file | tr -d "/n/t" > new_file
不可见字符都得用转义字符来表示的,这个都是统一的。

# cat file | tr -s [a-zA-Z] > new_file
7、删除空行
# cat file | tr -s "/n" > new_file
8、删除Windows文件“造成”的'^M'字符
# cat file | tr -d "/r" > new_file
或者
# cat file | tr -s "/r" "/n" > new_file
【注意】这里-s后面是两个参数"/r"和"/n",用后者替换前者
9、用空格符/040替换制表符/011
# cat file | tr -s "/011" "/040" > new_file
10、把路径变量中的冒号":",替换成换行符"/n"
# echo $PATH | tr -s ":" "/n"
这样看到的路径变量是不是更清晰:)

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值