曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 5524|回复: 0
打印 上一主题 下一主题

cut -- 在文件的每一行中提取片段

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2009-6-2 02:29:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基本格式
cut -d ' 分隔字符 ' -f fields
cut -c 字符区间
参数
-d : 后面接分割符。与 -f 一起使用;
-f : 依据 -d 的分割符将一段讯息分割成为数段,用 -f 取出其中的第几段;
-c : 以字节为单位取出固定字符区间。
--comlement : 以补足方式输出
--output-delimiter : 输出分隔符


应用举例-1(将 PATH 变量取出,找出第4个路径)
beyes@linux-beyes:~> echo $PATH
/usr/lib/mpi/gcc/openmpi/bin:/home/beyes/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/opt/kde3/bin:/usr/lib/mit/bin:/usr/lib/mit/sbin
#找出上面蓝色加亮部分的路径并单独列出
beyes@linux-beyes:~> echo $PATH | cut -d ':' -f 4
/usr/bin
#另外,如果想同时列出第3和第5个路径,则如下
beyes@linux-beyes:~> echo $PATH | cut -d ':' -f 3,5
/usr/local/bin:/bin

应用举例-2(将 export 输出的信息,取出第 12 字节以后的所有字符串)
beyes@linux-beyes:~> export
declare -x ALSA_CONFIG_PATH="/etc/alsa-pulse.conf"
declare -x COLORTERM="gnome-terminal"
declare -x CPU="i686"
declare -x CSHEDIT="emacs"
declare -x CVS_RSH="ssh"
.... .... ...
这里用 -c 参数来解决:
beyes@linux-beyes:~> export | cut -c 12-
ALSA_CONFIG_PATH="/etc/alsa-pulse.conf"
COLORTERM="gnome-terminal"
CPU="i686"
CSHEDIT="emacs"
CVS_RSH="ssh"
... ... ... ...
-c 参数后面是个范围,比如显式第 12-18 个字节里的内容,就是 cut -c 12-20 :
beyes@linux-beyes:~> export | cut -c 12-20
ALSA_CONF
COLORTERM
CPU="i686
CSHEDIT="
CVS_RSH="
... ... ... ...

应用举例-3(从last命令中筛选出近一个月来登录的用户名)
beyes@linux-beyes:~> last
beyes    pts/4        :0.0             Mon Jun  1 23:52 - 23:54  (00:01)   
beyes    pts/3        :0.0             Mon Jun  1 23:23   still logged in   
beyes    pts/3        :0.0             Mon Jun  1 00:22 - 00:35  (00:12)   
beyes    pts/1        :0.0             Mon Jun  1 00:19   still logged in   
root     pts/3        :1.0             Sun May 31 18:06 - 18:11  (00:04)   
root     pts/1        192.168.2.104    Sun May 31 18:05 - 18:42  (00:37)   
... ... ... ...
下面进行筛选:
beyes@linux-beyes:~> last | cut -d ' ' -f 1
beyes
beyes
beyes
beyes
root
root
说明: 在上面,可以用空格作为间隔符来取出 last 命令结果的第一列信息(登录用户帐号)。但是第一列(用户名)和第二列(终端或虚拟终端)之间的空格不止一个,所以要用如 cut -d ' ' -f 1,2 这样形式的命令,输出结果并不是想要的。所以,用 cut 来处理多空格相连的数据时会显得吃力。cut 的用途主要用来分析日志(log)文件,其他场合所用不多。

--complement 以补足方式输出
有时文本中有许多列,我们如果想剔除掉其中少数几列,然后输出其他的列,那么此时使用 --complement 的补足方式输出就很方便了,比如:
# cat tmp.txt
No      Name    Mark    Percent
1       Tom     38      80
2       Jim     58      10
3       Lee     48      30
4       Ken     58      40
假设不想输出第 2 列,而其他列均要被输出,那么可以:
# cut -f2 --complement tmp.txt
No      Mark    Percent
1       38      80
2       58      10
3       48      30
4       58      40

--output-delimiter 指定输出分隔符
有时可能为了输出的美观或以新一种的排版方式输出,我们需要自定义一个列的分隔符,如下面的测试文本:
# cat temp.txt
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
# cut temp.txt -c1-3,6-9 --output-delimiter ":"
abc:fghi
abc:fghi
abc:fghi
abc:fghi

下表是区间参数说明
参数
说明
N
第 N 个字节,字符或字段,从1开始计数
N-
从第N个字节,字符或字段直至行尾
N-M
从第N到第M(包括第M)个字节,字符或字段
-M
从第 1 到第 M(包括第M)个字节,字符或字段
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 19:35 , Processed in 0.081421 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表