Linux学习之三:cut,paste,find

一、cut命令
对有格式的数据进行处理,默认分隔符是TAB,一段为field;
-b:以字节为单位进行分割,这些字节位置将忽略多字节字符边界,除非指定-n标志
-c: 以字符为单位进行分割
-d:自定义分隔符,默认为制表符TAB
-f :指定显示哪一个field
-n:取消分割多字节字符,仅和-b一起使用,

1.以“字节”定位
[rocrocket@rocrocket programming]$ who
rocrocket :0           2018-01-08 11:07
rocrocket pts/0        2018-01-08 11:23 (:0.0)
rocrocket pts/1        2018-01-08 14:15 (:0.0)
如果我们想要提取每一行的第三个字节,就像这样
[rocrocket@rocrocket programming]$ who|cut -b 3
c
c
c
注意:使用-b选项,执行此命令时,cut会把-b后面的所有的定位进行从小到大排序,然后再提取。定位的顺序颠倒也是没有效果的。
1.1小技巧1
[rocrocket@rocrocket programming]$ who|cut -b 3-5
cro
cro
cro
1.2小技巧2:前面三个字节
[rocrocket@rocrocket programming]$ who|cut -b -3
roc
roc
roc
1.3小技巧3:从第三个字节到最后
[rocrocket@rocrocket programming]$ who|cut -b 3-
rocket :0           2018-01-08 11:07
rocket pts/0        2018-01-08 11:23 (:0.0)
rocket pts/1        2018-01-08 14:15 (:0.0)
1.4 -b和-c的输出是由差别的,这在输出内容是中文的时候就能够看出差别了。-b输出中文为乱码,因为-b以字节(8位二进制位)计算。这个时候当遇到多字节字符时,可以使用-n选项,-n指示不要把多字节字符拆开。

2.以“域”来定位
tail /etc/passwd
cut -d : -f 1 </etc/passwd
cut -d : -f 1,2,3 </etc/passwd
cut -d : -f 1-3 </etc/passwd

3.遇到“空格”和“制表符”怎么分辨?
sed -n l [文件名] (l为L的小写字母形式)
如果是制表符,会显示\t符号,如果是空格,会原样显示

4.注意:-d 后面的间隔符,只能是一个字符,而不能是一个字符串

5.综合测试
5.1一个通讯录文件
cat >a.txt
tom 13726266666
mary 13612345678
取出手机号码
cut -f 2 <a.txt
取出手机号码前三位
cut -f 2 <a.txt > b.txt
cut -c 1-3 b.txt

5.2取系统当前时间的日期
date > a.txt
cut -d ' ' -f 3 a.txt > b.txt
cut -c 1-2 b.txt
5.3取系统当前时间的小时
cut -d ' ' -f 5 a.txt > c.txt
cut -d : -f 1 c.txt

二、paste命令
paste的意思为粘贴。该命令将多个文件的内容合并,与cut的功能相反
粘贴两个不同来源的数据时,首先需要进行分类,确保两个文件行数相同。paste将按行将不同的文件行信息放在一行。缺省情况下,paste连接时,用空格或者tab键分割新行中不同文本,除非指定-d选项,它将成为域分隔符
-d:指定域分隔符
-s:将每个文件合并成行而不是按行粘贴

1.例子1
文件a:a.txt
ID897
ID666
ID982
文件b:b.txt
P.Jones
S.Round
L.Clip
然后执行paste命令将a.txt和b,txt两个文件粘贴成两列
1.1 $ paste a.txt b.txt
ID897 P.Jones
ID666 S.Round
ID982 L.Clip
1.2 $ paste b.txt a.txt
P.Jones ID897
S.Round ID666
L.Clip ID982
1.3 $ paste -d : a.txt b.txt
P.Jones:ID897
S.Round:ID666
L.Clip:ID982
1.4 $ paste -s a.txt b.txt 合并两行,而不是按行粘贴
ID897 ID666 ID982
P.Jones S.Round L.Clip

2.选项“-”
从标准输入中读一次数据,使用空格作域分隔符,以一个6列的格式显示目录列表
2.1 $ ls /etc | paste -d " " - - - - - -
MANPATH PATH SHLIB_PATH SnmpAgent.d/ TIMEZONE X11/
acct/ aliases@ arp@ audeventstab audomon@ auto_master
auto_parms.log auto_parms.log.old backup@ backup.cfg bcheckrc@ bootpd@
bootpquery@ bootptab btmp@ catman@ checklist@ chroot@
clri@ cmcluster/ cmcluster.conf cmom.conf conf@ convertfs@
copyright cron@ csh.login d.cshrc@ d.exrc@ d.login@
2.2 $ ls /etc | paste -d "" - 以一列格式输出
MANPATH
PATH
SHLIB_PATH
SnmpAgent.d/
TIMEZONE
X11/
acct/
aliases@
arp@
audeventstab
audomon@
auto_master
auto_parms.log
auto_parms.log.old
backup@
backup.cfg
三、find命令
用于在一个目录(包括子目录)中搜索文件,可以指定一些匹配条件,如按文件名,文件类型,用户甚至是时间戳。
1.1 命令一般格式
find [path...] [expression]
-path:查找的路径
-options:指定的选项
-print:find命令将匹配的的文件输出到标准输出
-exec:find命令对匹配的文件执行该参数所给出的sehll命令。相应的命令格式为'command' {} \;
find命令将所有匹配到的文件一起传递给exec执行。但有些系统传递给exec的命令长度有限制,这样在find命令运行几分钟之后就会出现溢出错误。
1.2 常用选项及实例
-name:按照文件名查找文件
find /dir -name filename
find . -name "*.cpp"
-perm:按照文件权限来查找文件
find . -perm 755 -print :在当前目录下查找文件权限为755的文件
-prune:find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被忽略
find /apps -path "/apps/bin" -prune -o -print :在/apps目录下查找文件,但不希望在/apps/bin目录下查找
find /usr/sam -path "/usr/sam/dir1" -prune -o -print :在/usr/sam目录下查找不在dir1子目录之内的所有文件
-user:按照文件的所有者查找文件
find ~ -user sam -print :在家目录下查找文件所有者为sam的文件
-group:按照文件的所属组查找文件
find /apps -group tom -print
-mtime -n/+n:按照文件的更改时间来查找文件,-n表示更改时间距离现在n天以内,+n表示n天以前
find / -mtime -5 -print:在系统根目录下查找更改时间在5天以内的文件
find /var/test -mtime +5 -print:在/vat/test目录下查找更改时间在5天以前的文件
-nogroup:查找无有效所属组的文件,即该文件所属组在/etc/groups中不存在
find / -nogroup -print
-nouser:查找无有效所有者的文件,即该文件的所有者在/etc/passwd中不存在
find /home -nouser -print
-newer file1 !file2:查找比file1文件新但是比file2文件旧的文件
-type:查找某一个类型的文件
b:块设备文件
d:目录
c:字符设备文件
p:管道文件
l:符号链接文件
f:普通文件
find /etc -type d -print :/etc中查找所有的目录
find . ! -type d -print:在当前目录下查找除了目录以外的所有类型的文件
-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计
find . -size +1000000c -print 在当前目录下查找文件长度大于1M字节的文件
find . -size 100c -print 在当前目录下查找文件长度恰好为100字节的文件
find . -size +10 -print 在当前目录下查找长度超过10块的文件(1块等于512字节)
-depth:查找文件时,首先在当前目录下查找,然后再在其子目录下查找
find / -name "*.cpp" -depth -print 它将会首先匹配所有的文案金然后再进入子目录中查找
-mount:在查找文件时不跨越文件系统mount点
find . -name "*.cpp" -mount -print : 从当前目录开始查找位于本系统中文件名以cpp结尾的文件(不进入其他文件系统)
-follow:如果find命令遇到符号链接文件,就跟踪到链接所指向的文件
1.3 find与xargs
find命令把匹配到的文件传递给xargs命令,而xargs命令只获取一部分文件而不是全部,这样就避免了溢出。如果想要处理全部文件,可以分批次处理
在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;
而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。
find . -type f -print | xargs file  查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件
find / -name "core" -print | xargs echo "" >/tmp/core.log  在整个系统中查找内存信息转储文件( core dump) ,然后把结果保存到/tmp/core.log 文件中:
find . -type f -print | xargs grep "hostname"  用grep命令在所有的普通文件中搜索hostname这个词
find ./ -mtime +3 -print|xargs rm -f –r  删除3天以前的所有东西 (find . -ctime +3 -exec rm -rf {} \;)
find ./ -size 0 | xargs rm -f &  删除文件大小为零的文件
find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。
1.4 综合例子
删除某个文件的时候,发现存在硬链接,如何找到硬链接,然后删除它们?
所有的硬链接的每一个文件的inode是相同的。用find命令查所有根目录下的固定的inode
ls -i a.txt
find /home/stu -inum {inode}
然后逐个删除
find / inum {inode} -exec em {} \;

1.5 扩展:
stat 显示文件的详细信息
stat a.txt
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值