Linux命令篇之cut命令和join命令

cut命令的用法

cut是一个选取命令,就是将一段数据经过分析,取出我们想要的。一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的

(1)其语法格式为:
cut  [-bn] [file] 或 cut [-c] [file]  或  cut [-df] [file]

使用说明
cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。

主要参数
-b 以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c以字符为单位进行分割。
-d自定义分隔符,默认为制表符。
-f 与-d一起使用,指定显示哪个区域。
-n取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的<br/>范围之内,该字符将被写出;否则,该字符将被排除。

(2)cut一般以什么为依据呢? 也就是说,我怎么告诉cut我想定位到的剪切内容呢?

cut命令主要是接受三个定位方法:

第一,字节(bytes),用选项-b

第二,字符(characters),用选项-c

第三,域(fields),用选项-f

(3)以“字节”定位

举个例子吧,当你执行ps命令时,会输出类似如下的内容:

[[email protected]]$ who
rocrocket :0          2009-01-08 11:07
rocrocket pts/0        2009-01-08 11:23(:0.0)
rocrocket pts/1        2009-01-08 14:15(:0.0)
如果我们想提取每一行的第3个字节,就这样:

[[email protected]]$ who|cut -b 3
c
c
c

(4)如果“字节”定位中,我想提取第3,第4、第5和第8个字节,怎么办?

-b支持形如3-5的写法,而且多个定位之间用逗号隔开就成了。看看例子吧:

[[email protected]]$ who|cut -b 3-5,8
croe
croe
croe
但有一点要注意,cut命令如果使用了-b选项,那么执行此命令时,cut会先把-b后面所有的定位进行从小到大排序,然后再提取。可不能颠倒定位的顺序哦。这个例子就可以说明这个问题:

[[email protected]]$ who|cut -b 8,3-5
croe
croe
croe
(5)还有哪些类似“3-5”这样的小技巧,列举一下吧!

[[email protected]]$ who
rocrocket :0          2009-01-08 11:07
rocrocket pts/0        2009-01-08 11:23(:0.0)
rocrocket pts/1        2009-01-08 14:15(:0.0)
[[email protected] programming]$ who|cut -b -3
roc
roc
roc
[[email protected] programming]$ who|cut -b 3-
crocket :0          2009-01-08 11:07
crocket pts/0        2009-01-08 11:23 (:0.0)
crocket pts/1        2009-01-08 14:15 (:0.0)
想必你也看到了,-3表示从第一个字节到第三个字节,而3-表示从第三个字节到行尾。如果你细心,你可以看到这两种情况下,都包括了第三个字节“c”。

如果我执行who|cut -b -3,3-,你觉得会如何呢?答案是输出整行,不会出现连续两个重叠的c的。看:

[[email protected]]$ who|cut -b -3,3-
rocrocket :0          2009-01-08 11:07
rocrocket pts/0        2009-01-08 11:23(:0.0)
rocrocket pts/1        2009-01-08 14:15(:0.0)
(6)给个以字符为定位标志的最简单的例子吧!

下面例子你似曾相识,提取第3,第4,第5和第8个字符:

[[email protected]]$ who|cut -c 3-5,8
croe
croe
croe
不过,看着怎么和-b没有什么区别啊?莫非-b和-c作用一样? 其实不然,看似相同,只是因为这个例子举的不好,who输出的都是单字节字符,所以用-b和-c没有区别,如果你提取中文,区别就看出来了,来,看看中文提取的情况:

[[email protected]]$ cat cut_ch.txt
星期一
星期二
星期三
星期四
[[email protected] programming]$ cut -b 3 cut_ch.txt

[[email protected] programming]$ cut -c 3 cut_ch.txt




看到了吧,用-c则会以字符为单位,输出正常;而-b只会傻傻的以字节(8位二进制位)来计算,输出就是乱码。

既然提到了这个知识点,就再补充一句,如果你学有余力,就提高一下。
当遇到多字节字符时,可以使用-n选项,-n用于告诉cut不要将多字节字符拆开。

例子如下:
[[email protected] programming]$ cat cut_ch.txt |cut -b 2

[[email protected] programming]$ cat cut_ch.txt |cut -nb 2

[[email protected]]$ cat cut_ch.txt |cut -nb 1,2,3




(7)域是怎么回事呢?解释解释:)

为什么会有“域”的提取呢,因为刚才提到的-b和-c只能在固定格式的文档中提取信息,而对于非固定格式的信息则束手无策。这时候“域”就派上用场了。如果你观察过/etc/passwd文件,你会发现,它并不像who的输出信息那样具有固定格式,而是比较零散的排放。但是,冒号在这个文件的每一行中都起到了非常重要的作用,冒号用来隔开每一个项。

我们很幸运,cut命令提供了这样的提取方式,具体的说就是设置“间隔符”,再设置“提取第几个域”,就OK了!

以/etc/passwd的前五行内容为例:

[[email protected]]$ cat /etc/passwd|head -n 5
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
[[email protected] programming]$ cat /etc/passwd|head -n 5|cut -d : -f 1
root
bin
daemon
adm
lp
看到了吧,用-d来设置间隔符为冒号,然后用-f来设置我要取的是第一个域,再按回车,所有的用户名就都列出来了!呵呵 有成就感吧!

当然,在设定-f时,也可以使用例如3-5或者4-类似的格式:

[[email protected]]$ cat /etc/passwd|head -n 5|cut -d : -f 1,3-5
root:0:0:root
bin:1:1:bin
daemon:2:2:daemon
adm:3:4:adm
lp:4:7:lp
[[email protected] programming]$ cat /etc/passwd|head -n 5|cut -d : -f1,3-5,7
root:0:0:root:/bin/bash
bin:1:1:bin:/sbin/nologin
daemon:2:2:daemon:/sbin/nologin
adm:3:4:adm:/sbin/nologin
lp:4:7:lp:/sbin/nologin
[[email protected] programming]$ cat /etc/passwd|head -n 5|cut -d : -f -2
root:x
bin:x
daemon:x
adm:x
lp:x
(8)如果遇到空格和制表符时,怎么分辨呢?我觉得有点乱,怎么办?

有时候制表符确实很难辨认,有一个方法可以看出一段空格到底是由若干个空格组成的还是由一个制表符组成的。

[[email protected]]$ cat tab_space.txt
this is tab finish.
this is several space      finish.
[[email protected] programming]$ sed -n l tab_space.txt
this is tab\tfinish.$
this is several space      finish.$
看到了吧,如果是制表符(TAB),那么会显示为\t符号,如果是空格,就会原样显示。
通过此方法即可以判断制表符和空格了。
注意,上面sed -n后面的字符是L的小写字母哦,不要看错。

(9)我应该在cut -d中用什么符号来设定制表符或空格呢?

其实cut的-d选项的默认间隔符就是制表符,所以当你就是要使用制表符的时候,完全就可以省略-d选项,而直接用-f来取域就可以了。

如果你设定一个空格为间隔符,那么就这样:

[[email protected]]$ cat tab_space.txt |cut -d ‘ ‘ -f 1
this
this
注意,两个单引号之间可确实要有一个空格哦,不能偷懒。
而且,你只能在-d后面设置一个空格,可不许设置多个空格,因为cut只允许间隔符是一个字符。

[[email protected]]$ cat tab_space.txt |cut -d ‘ ‘ -f 1
cut: the delimiter must be a single character
Try `cut --help‘ for more information.

(10)cut有哪些缺陷和不足?

猜出来了吧?对,就是在处理多空格时。
如果文件里面的某些域是由若干个空格来间隔的,那么用cut就有点麻烦了,因为cut只擅长处理“以一个字符间隔”的文本内容

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   显示版本信息。

指定输出字段:
-o <FILENO.FIELDNO> ...
其中FILENO=1表示第一个文件,FILENO=2表示第二个文件,FIELDNO表示字段序号,从1开始编号。默认会全部输出,但关键字列只输出一次。
比如:-o 1.11.22.2表示输出第一个文件的第一个字段、第二个字段,第二个文件的第二个字段。

使用示例
示例一 内连接(忽略不匹配的行)
不指定任何参数的情况下使用join命令,就相当于数据库中的内连接,关键字不匹配的行不会输出。
[[email protected] linux]# cat month_cn.txt
1       一月
2       二月
3       三月
4       四月
5       五月
6       六月
7       七月
8       八月
9       九月
10      十月
11      十一月
12      十二月
13      十三月,故意的
[[email protected] linux]# cat month_en.txt
1       January
2       February
3       March
4       April
5       May
6       June
7       July
8       August
9       September
10      October
11              November
12      December
14      MonthUnknown
注:注意两个文件的内容,中文版的多了十三月,英文版的多了14月,这纯粹是为了方便演示。
[[email protected] linux]# join month_cn.txt month_en.txt
1一月 January
2二月 February
3三月 March
4四月 April
5五月 May
6六月 June
7七月 July
8八月 August
9九月 September
10十月 October
11十一月 November
12十二月 December
[[email protected] linux]#
示例二 左连接(又称左外连接,显示左边所有记录)
显示左边文件中的所有记录,右边文件中没有匹配的显示空白。
[[email protected] linux]# join -a1 month_cn.txt month_en.txt
1一月 January
2二月 February
3三月 March
4四月 April
5五月 May
6六月 June
7七月 July
8八月 August
9九月 September
10十月 October
11十一月 November
12十二月 December
13十三月,故意的
[[email protected] linux]#

示例三 右连接(又称右外连接,显示右边所有记录)
显示右边文件中的所有记录,左边文件中没有匹配的显示空白。
[[email protected] linux]# join -a2 month_cn.txt month_en.txt
1一月 January
2二月 February
3三月 March
4四月 April
5五月 May
6六月 June
7七月 July
8八月 August
9九月 September
10十月 October
11十一月 November
12十二月 December
14 MonthUnknown
[[email protected] linux]#

示例四 全连接(又称全外连接,显示左边和右边所有记录)
[[email protected] linux]# join -a1 -a2 month_cn.txt month_en.txt
1一月 January
2二月 February
3三月 March
4四月 April
5五月 May
6六月 June
7七月 July
8八月 August
9九月 September
10十月 October
11十一月 November
12十二月 December
13十三月,故意的
14 MonthUnknown
[[email protected] linux]#

示例五 指定输出字段
比如参数 -o 1.1表示只输出第一个文件的第一个字段。
[[email protected] linux]# join -o 1.1 month_cn.txt month_en.txt
1
2
3
4
5
6
7
8
9
10
11
12
[[email protected] linux]# join -o 1.12.2 month_cn.txt month_en.txt
1 January
2 February
3 March
4 April
5 May
6 June
7 July
8 August
9 September
10 October
11 November
12 December
[[email protected] linux]# join -o 1.12.21.2 month_cn.txt month_en.txt
1 January 一月
2 February 二月
3 March 三月
4 April 四月
5 May 五月
6 June 六月
7 July 七月
8 August 八月
9 September 九月
10 October 十月
11 November 十一月
12 December 十二月
[[email protected] linux]# join -o 1.12.21.21.3 month_cn.txt month_en.txt   <== 字段1.3并不存在
1 January 一月
2 February 二月
3 March 三月
4 April 四月
5 May 五月
6 June 六月
7 July 七月
8 August 八月
9 September 九月
10 October 十月
11 November 十一月
12 December 十二月
[[email protected] linux]#

示例六 指定分隔符
[[email protected] linux]# join -t ‘:‘ /etc/passwd /etc/shadow
root:x:0:0:root:/root:/bin/bash:$1$K8WSIAfQ$9i1h6a4V1XeIn0lv.CT53/:14833:0:99999:7:::
bin:x:1:1:bin:/bin:/sbin/nologin:*:14833:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:14833:0:99999:7:::
adm:x:3:4:adm:/var/adm:/sbin/nologin:*:14833:0:99999:7:::
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin:*:14833:0:99999:7:::
sync:x:5:0:sync:/sbin:/bin/sync:*:14833:0:99999:7:::
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown:*:14833:0:99999:7:::
halt:x:7:0:halt:/sbin:/sbin/halt:*:14833:0:99999:7:::
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin:*:14833:0:99999:7:::
news:x:9:13:news:/etc/news::*:14833:0:99999:7:::
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin:*:14833:0:99999:7:::
operator:x:11:0:operator:/root:/sbin/nologin:*:14833:0:99999:7:::
games:x:12:100:games:/usr/games:/sbin/nologin:*:14833:0:99999:7:::
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin:*:14833:0:99999:7:::
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin:*:14833:0:99999:7:::
nobody:x:99:99:Nobody:/:/sbin/nologin:*:14833:0:99999:7:::
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin:!!:14833:0:99999:7:::
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin:!!:14833:0:99999:7:::
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin:!!:14833:0:99999:7:::
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin:!!:14833:0:99999:7:::
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin:!!:14833:0:99999:7:::
pcap:x:77:77::/var/arpwatch:/sbin/nologin:!!:14833:0:99999:7:::
ntp:x:38:38::/etc/ntp:/sbin/nologin:!!:14833:0:99999:7:::
dbus:x:81:81:System message bus:/:/sbin/nologin:!!:14833:0:99999:7:::
avahi:x:70:70:Avahi daemon:/:/sbin/nologin:!!:14833:0:99999:7:::
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin:!!:14833:0:99999:7:::
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin:!!:14833:0:99999:7:::
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin:!!:14833:0:99999:7:::
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin:!!:14833:0:99999:7:::
avahi-autoipd:x:100:101:avahi-autoipd:/var/lib/avahi-autoipd:/sbin/nologin:!!:14833:0:99999:7:::
oprofile:x:16:16:Special user account to be used by OProfile:/home/oprofile:/sbin/nologin:!!:14833:0:99999:7:::
xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin:!!:14833:0:99999:7:::
gdm:x:42:42::/var/gdm:/sbin/nologin:!!:14833:0:99999:7:::
sabayon:x:86:86:Sabayon user:/home/sabayon:/sbin/nologin:!!:14833:0:99999:7:::
oracle:x:500:500::/opt/oracle:/bin/bash:$1$v64Pa.m.$GZMrQiOWCdQPF8XKtWju30:14833:0:99999:7:::
mysql:x:101:104:MySQL server:/var/lib/mysql:/bin/bash:!!:14866::::::
时间: 2024-12-05 19:28:54

Linux命令篇之cut命令和join命令的相关文章

Linux——学习篇(二)之find命令

Linux中的find命令: 对于Linux而言,有着"一切皆文件"的这一特性,所以相比较windows而言对于文件没有后缀名,查找是并不轻松的的.因此,需要我们熟悉Linux下的find命令,更快地找到我们所需要的文件. 1. 命令格式 find   pathname   -options   [   -print  -exec   -ok ...] 2. 命令参数 pathname: find 命令所查找的目录路径.例如用.来表示当前目录,用.表示系统根目录. -print:   

Linux基础篇之五基础命令 ---- 2

回顾: 上一篇博文我们讲的是几个处理目录类的常用命令,分别是ls, cd, pwd, mkdir, rmdir, cp, rm  链接:http://ccschan.blog.51cto.com/11854461/1841723 本文主要讲文件查看类的命令,在linux中,这些命令是最基本的,也是必须掌握的. 文件查看类命令,主要有以下几个: ·cat    由第一行开始显示文件内容 ·tac     由最后一行开始逆序显示文件内容,同tac命令是倒着写的 ·nl     显示的时候,顺道输出行

Linux系统管理——基础命令篇

终于开始接触Linux,现在是一个标准的菜鸟,那么就踏踏实实,一步一步开始进阶,希望我的博客慢慢可以给后来人带来帮助. 废话少说,下面就是我所接触的Linux系统管理的一些基础命令,以及我个人添加的命令的释义,还望大大们多多指教. 一.Linux命令行基础 [[email protected] ~]# uname -r       //查看内核版本 [[email protected] ~]# uname -a       //查看内核相关详细信息 [[email protected] ~]#

Android系统篇之----Android中的run-as命令引出升降权限的安全问题(Linux中的setuid和setgid)

一.前言 最近一周比较忙,没时间写东西了,今天继续开始我们今天的话题:run-as命令,在上周的开发中,遇到一个问题,就是在使用run-as命令的时候出现了一个错误,不过当时因为工作进度的问题,这问题就搁浅没有解决,用了其他一个曲线救国的方式去解决的.那么咋们今天闲来说说Android中的run-as命令吧. 二.遇到的问题&解决问题 Android中我们知道如果设备没有root,我们想看一个应用的沙盒数据(/data/data/目录内容),在以前的方式很难办到,一般人都是选择root之后,去查

Linux下Join命令

Linux下Join命令 最近新上线算法,打算分析起点书籍点击率的波动,原来已经有流程每天每本书籍的点击率数据(文件).之前这种情况都是写代码对不同天的进行合并,后来发现linux下直接就有join命令,可以做类似的事情,而且功能也挺强大,速度也很快. join [-i][-a<1或2>][-e<字符串>][-o<格式>][-t<字符>][-v<1或 2>][-1<栏位>][-2<栏位>][--help][--versio

Linux命令篇之mkdir命令,rmdir命令和rm命令

在 Linux 下用 mkdir 命令来创建目录和子目录 了解了用 ls 命令在目录中列出条目后,现在我们要学习在 Linux 系统下创建目录.在 Linux 下,我们可以使用 mkdir 命令.Mkdir 是"make directory" 的缩写词. mkdir 是什么呢 Mkdir 是一个用来在 Linux 系统下创建目录的命令.此命令属于内建命令. 运行 mkdir 命令 你可以在你的控制台直接键入 mkdir 来使用它. $ mkdir 默认情况下,不带任何参数运行 mkdi

Linux命令篇之stat命令和cp命令

# stat: ls 命令可能是每一个Unix 使用者第一个学习的命令之一, 但它仅仅显示了 stat 命令能给出的信息的一小部分. stat 命令从文件的索引节点获取信息.正如你可能已经了解的那样, 每一个系统里的文件都存有三组日期和时间, 它们包括最近修改时间(即使用 ls -l 命令时显示的日期和时间), 最近状态改变时间(包括对文件重命名)和最近访问时间. 使用长列表模式查看文件信息, 你会看到类似下面的内容: 代码如下: $ ls -l trythis -rwx------ 1 shs

linux学习笔记命令篇1---命令ls

前言:  linux中接触最多的就是命令和文件. 命令 命令是有其格式的, 一般格式是command [option] parameter1 parameter2 [paramete3 ...]: 注释: command是命令.这些是linux可以执行的命令名称,类似与一些关键字.如果输入非法的命令,linux会提示找不到这个命令的. option是选项. 这个用中括号括起来的表示该选项可以用,也可以不用,如果没有就是默认选项.选项一般是用减号'-'开始,多个选项可以合起来写成一个,也可以分开写

Linux基础篇之五基础命令 ---- 3

在linux中,我们经常需要查找某些文件,以及文件所在目录等.那么我们需要用到一些基本的文件查找类命令. 文件查找命令主要有以下几个: ·which    查看命令或可执行文件的完整路径 ·whereis   显示二进制文件路径.使用手册文件路径.源码文件路径 ·locate    配合数据库查看文件路径 ·find     搜索硬盘查询特定文件 ·which which命令的作用,在指定的PATH路径中,搜索某个系统命令的位置,并且返回第一搜索结果.可以查看某个系统命令是否存在,且命令所在的源