您的位置:首页 > 其它

文件及文本管理命令 cp,cut,sort,uniq,tr详解

2015-08-19 20:40 603 查看
一:文件管理类命令:cp,mv,rm
1、cp:copy简写

cp SRC DEST
SRC是文件
如果DEST不存在,则新建之,在把SRC的内容写到DEST中
如果DEST存在,
如果DEST是个文件,则询问是否覆盖
如果DEST是个目录,则保持原文件名复制到目标目录中
SRC是多个文件,目标只能有一个,且必须是目录,还得事先存在
SRC是目录:-R,-r,--recursive:递归复制
-P(大写),--no-dereference:不跟踪原符号链接,复制符号链接 #不加-P默认自动把符号链 接的文件的内容复制的指定目录

-p(小写),保留原文件的指定的属性信息
-a,--archive:归档,常用于备份时保留原文件的所有属性,相当于-dR --presereve=all
-i,--interactive:覆盖目标文件之前提醒用户

-f,--force:强制覆盖
-l,--link:为文件创建硬链接而不是复制文件






2、mv命令:move
mv SRC... DEST

3、rm命令:remove
rm FILE
-r,-R 递归
-f:强制删除

二、文本管理类命令: nano,wc,cut,sort,uniq
1、nano:全屏幕文本编辑器

2、wc:word count
wc [OPTION]... [FILE]

-l:--line 统计行数
-w:--words 统计单词数
-c:--bytes 统计字节数
-m:统计字符数

3、cut:字符截取命令(列)
cut [OPTION]... [FILE]..
-d:指明分隔符
-d '' :表示以空格为分隔符 #默认以制表符为分割符
-f # :指明要保留的字段
单个: #
离散的多个:#,#,#
连续的多个:#-#
[root@localhost ~]# cat 111
a1 a2 a3 a4 a5  a6
b1 b2 b3 b4 b5  b6
c1 c2 c3 c4 c5  c
[root@localhost ~]# cut -d ' ' -f 1 111  #以空隔为分隔符,截取第一列
a1
b1
c1
[root@localhost ~]# cut -d ' ' -f 3 111
a3
b3
c3
[root@localhost ~]# cut -d ' ' -f 1,3 111  #以空隔为分隔符,截取第1和第3列
a1 a3
b1 b3
c1 c3
[root@localhost ~]# cut -d ' ' -f 13 111

[root@localhost ~]# cut -d ' ' -f 1-3 111  #以空隔为分隔符,截取第1到第3列
a1 a2 a3
b1 b2 b3
c1 c2 c3
[root@localhost ~]# cut -d '  ' -f 1-3 111
cut: the delimiter must be a single character
Try `cut --help' for more information.
[root@localhost ~]# cut -d ' ' -f 6 111    #不能以2个空格为分隔符?
4、sort:字符处理命令 (排序)(针对行)

sort [OPTION]... [FILE]...
-r:逆序排序
-f:忽略大小写 常与-u结合使用
-n:按数值大小排序
-t:指定分隔符,默认是制表符
-k:按照指定的字段范围
-u:移除重复的行
[root@xxj ~]# sort -t: -k3 -n /etc/passwd
root:x:0:0:chfn 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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
httpd:x:498:498::/home/httpd:/bin/bash
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
testbash:x:501:501::/home/testbash:/bin/bash
basher:x:502:502::/home/basher:/bin/bash
nologin:x:503:503::/home/nologin:/sbin/nologin
fedora:x:504:504::/home/fedora:/bin/bash
user1:x:505:505::/home/user1:/bin/bash
bash1:x:506:506::/home/bash1:/bin/bash
xj:x:507:507::/home/xj:/bin/bash
Oracle:x:3000:3000::/home/database:/bin/bash
[root@xxj ~]#
1 准备素材
$ cat facebook.txt
google 110 5000
baidu 100 5000
guge 50 3000
sohu 100 4500
第一个域是公司名称,第二个域是公司人数,第三个域是员工平均工资。2 我想让facebook.txt按照公司人数排序
$ sort -n -t ‘ ‘ -k 2 facebook.txt
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000
[root@xxj tmp]# sort -t' ' -k2 666test
sohu 100 4500
baidu 100 5000
google 110 5000
guge 50 3000
但是,此处出现了问题,那就是baidu和sohu的公司人数相同,都是100人,这个时候怎么办呢?按照默认规矩,是从后面的域进行升序排序,,如果加了-n选项就从第一个域开始进行升序排序??怎么是这样好难理解3 我想让facebook.txt按照公司人数排序 ,人数相同的按照员工平均工资升序排序:
$ sort -n -t ‘ ‘ -k2 -k3 facebook.txt
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000
看,我们加了一个-k2 -k3就解决了问题。对滴,sort支持这种设定,就是说设定域排序的优先级,先以第2个域进行排序,如果相同,再以第3个域进行排序4 我想让facebook.txt按照员工工资降序排序,如果员工人数相同的,则按照公司人数升序排序$ sort -n -t ‘ ‘ -k 3r -k 2 facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 30006 -k选项的具体语法格式要继续往下深入的话,就不得不来点理论知识。你需要了解-k选项的语法格式,如下:[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]这个语法格式可以被其中的逗号(“,”)分为两大部分,Start部分和End部分,注意:Start和End跨域没有意义先给你灌输一个思想,那就是“如果不设定End部分,那么就认为End被设定为行尾”。这个概念很重要的,但往往你不会重视它。Start部分也由三部分组成,其中的Modifier部分就是我们之前说过的类似n和r的选项部分。我们重点说说Start部分的FStart和C.Start。C.Start也是可以省略的,省略的话就表示从本域的开头部分开始。之前例子中的-k 2和-k 3就是省略了C.Start的例子喽。FStart.CStart,其中FStart就是表示使用的域,而CStart则表示在FStart域中从第几个字符开始算“排序首字符”。同理,在End部分中,你可以设定FEnd.CEnd,如果你省略.CEnd,则表示结尾到“域尾知道行尾”,即本域的最后一个字符。或者,如果你将CEnd设定为0(零),也是表示结尾到“域尾”。7、从公司英文名称的第二个字母开始进行排序:$ sort -t ‘ ‘ -k 1.2 facebook.txt
baidu 100 5000
sohu 100 4500
google 110 5000
guge 50 3000看,我们使用了-k 1.2,这就表示对第一个域的第二个字符开始到本域的最后一个字符为止的字符串进行排序。你会发现baidu因为第二个字母是a而名列榜首。sohu和 google第二个字符都是o,但sohu的h在google的o前面,所以两者分别排在第二和第三。guge只能屈居第四了。
[root@xxj tmp]# sort -t' ' -k1.2 555test
faidu 100 5000
cb aa 30 c
bb aa 30 x
ab ba 30 b
sohu 100 4500
eoogle 100 6000
guge 50 3000
[root@xxj tmp]# sort -nt' ' -k1.2 555test
ab ba 30 b
bb aa 30 x
cb aa 30 c
eoogle 100 6000
faidu 100 5000
guge 50 3000
sohu 100 4500
[root@xxj tmp]#
只针对公司英文名称的第二个字母进行排序,如果相同的按照员工工资进行降序排序:
$ sort -t ‘ ‘ -k 1.2,1.2 -k 3,3nr facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000
由于只对第二个字母进行排序,所以我们使用了-k 1.2,1.2的表示方式,表示我们“只”对第二个字母进行排序。(如果你问“我使用-k 1.2怎么不行?”,当然不行,因为你省略了End部分,这就意味着你将对从第二个字母起到本域最后一个字符为止的字符串进行排序)。对于员工工资进行排 序,我们也使用了-k 3,3,这是最准确的表述,表示我们“只”对本域进行排序,因为如果你省略了后面的3,就变成了我们“对第3个域开始到最后一个域位置的内容进行排序” 了。10 思考思考关于-k和-u联合使用的例子:$ cat facebook.txt google 110 5000 baidu 100 5000 guge 50 3000 sohu 100 4500这是最原始的facebook.txt文件。$ sort -n -k 2 facebook.txt
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000$ sort -n -k 2 -u facebook.txt
guge 50 3000
baidu 100 5000
google 110 5000当设定以公司员工域进行数值排序,然后加-u后,sohu一行就被删除了!原来-u只识别用-k设定的域,发现相同,就将后续相同的行都删除。$ sort -k 1 -u facebook.txt
baidu 100 5000
google 110 5000
guge 50 3000
sohu 100 4500$ sort -k 1.1,1.1 -u facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500这个例子也同理,开头字符是g的guge就没有幸免于难。$ sort -n -k 2 -k 3 -u facebook.txt
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000咦!这里设置了两层排序优先级的情况下,使用-u就没有删除任何行。原来-u是会权衡所有-k选项,将都相同的才会删除,只要其中有一级不同都不会轻易删除的:)(不信,你可以自己加一行sina 100 4500试试看)

5、uniq:去重复行
说明:这个命令读取输入文件,并比较相邻的行。在正常情况下,第二个及以后更多个重复行将被删去,行比较是根据所用字符集的排序序列进行的。该命令加工后的结果写到输出文件中。输入文件和输出文件必须不同。如果输入文件用“- ”表示,则从标准输入读取。
-i:忽略大小写
-d:仅显示重复的行
-u:仅显示不重复的行
-c:去重后显示每行出现了的次数(相同且相邻才是重复)

三、bash特性之七:输入、输出重定向和管道
1、名词理解
程序:指令+数据=算法+数据结构
数据输入:交互式,文件,进程
数据输出:监视器,文件,进程
file descriptor:fd 文件描述符
标准输入(stdin):0 键盘
标准输出(stdout):1 监视器
错误输出(stderr):2 监视器
正常输出和错误是两个不同的数据流:
重定向:
输出重定向:>,>>
COMMAND > NEW_POSTION 覆盖重定向,会清空文件中原有的数据 注意:危险操作,关次功能, 可使用'set -c' ,相反操作为'set +c'
COMMAND >> NEW_POSTION 追加重定向,新数据会被附加在原有文件数据的后面
错误输出重定向:2>,2>>
正确和错误输出都保存在同一个文件中
[root@localhost ~]# cat /etc/issue >/tmp/q1 2>/tmp/q1      #方法一
[root@localhost ~]# cat /tmp/q1
CentOS release 6.5 (Final)
Kernel \r on an \m

[root@localhost ~]# cat /etc/isssue >/tmp/q1 2>/tmp/q1
[root@localhost ~]# cat /tmp/q1
cat: /etc/isssue: 没有那个文件或目录
[root@localhost ~]# cat /etc/isssue >/tmp/q1 2>>/tmp/q1
[root@localhost ~]# cat /tmp/q1
cat: /etc/isssue: 没有那个文件或目录
[root@localhost ~]# cat /etc/issue >>/tmp/q1 2>/tmp/q1
[root@localhost ~]# cat /tmp/q1
CentOS release 6.5 (Final)
Kernel \r on an \m

[root@localhost ~]# cat /etc/issue >>/tmp/q1 2>>/tmp/q1    #说明不能一个覆盖定向,一个追加重定向
[root@localhost ~]# cat /tmp/q1
CentOS release 6.5 (Final)
Kernel \r on an \m

CentOS release 6.5 (Final)
Kernel \r on an \m

[root@localhost ~]#
[root@localhost ~]# cat /etc/issue >/tmp/q2 2>$1           #方法二
-bash: $1: ambiguous redirect
[root@localhost ~]# cat /etc/issue >/tmp/q2 2>&1
[root@localhost ~]# cat /tmp/q2
CentOS release 6.5 (Final)
Kernel \r on an \m

[root@localhost ~]# cat /etc/issue >>/tmp/q2 2>&1
[root@localhost ~]# cat /tmp/q2
CentOS release 6.5 (Final)
Kernel \r on an \m

CentOS release 6.5 (Final)
Kernel \r on an \m

[root@localhost ~]# cat /etc/issue >>/tmp/q2 2>>&1
-bash: syntax error near unexpected token `&'
[root@localhost ~]# cat /etc/issue >/tmp/q2 2>>&1
-bash: syntax error near unexpected token `&'
[root@localhost ~]#
[root@localhost ~]# cat /etc/issue &>/tmp/q3
[root@localhost ~]# cat /tmp/q3
CentOS release 6.5 (Final)
Kernel \r on an \m

[root@localhost ~]# cat /etc/isssue &>/tmp/q3          #方法三
[root@localhost ~]# cat /tmp/q3
cat: /etc/isssue: 没有那个文件或目录
[root@localhost ~]# cat /etc/isssue &>>/tmp/q3
[root@localhost ~]# cat /tmp/q3
cat: /etc/isssue: 没有那个文件或目录
cat: /etc/isssue: 没有那个文件或目录
[root@localhost ~]# cat /etc/issue &>>/tmp/q3
[root@localhost ~]# cat /tmp/q3
cat: /etc/isssue: 没有那个文件或目录
cat: /etc/isssue: 没有那个文件或目录
CentOS release 6.5 (Final)
Kernel \r on an \m

[root@localhost ~]#
输入重定向:COMMAND < NEW_IN

2、tr:
tr [OPTION]... SET1 [SET2]
把输出数据中的在SET1中的每个字符对应地替换为SET2的每个字符:
[root@localhost ~]# cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m

[root@localhost ~]# tr 'aen' 'x' </etc/issue
CxxtOS rxlxxsx 6.5 (Fixxl)
Kxrxxl \r ox xx \m

[root@localhost ~]# tr 'aen' 'xxx' </etc/issue          #逐字符,不是单词
CxxtOS rxlxxsx 6.5 (Fixxl)
Kxrxxl \r ox xx \m

[root@localhost ~]# tr 'aen' 'xyz' </etc/issue
CyztOS rylyxsy 6.5 (Fizxl)
Kyrzyl \r oz xz \m

[root@localhost ~]# tr 'aen' '' </etc/issue
tr: 当不截断设置1 时,字符串2 不能为空
[root@localhost ~]# tr 'aen' ' ' </etc/issue
C  tOS r l  s  6.5 (Fi  l)
K r  l \r o     \m

[root@localhost ~]# tr 'aen'  </etc/issue
tr: "aen" 后缺少操作数
当进行替换操作时必须给定两组字符串。
请尝试执行"tr --help"来获取更多信息。
[root@localhost ~]#
-d:删除在输入的数据流中出现的属于SET1的每个对应的字符

root@localhost ~]# tr -d [ae] </etc/issue
CntOS rls 6.5 (Finl)
Krnl \r on n \m
COMMAND << EOF

Here Document
EOF
[root@localhost ~]# cat <<EOF
> Hello,world
> nihaoa
> shabiEOF
> EOF
Hello,world
nihaoa
shabiEOF
[root@localhost ~]# cat >/tmp/out <<EOF
Hello,world
nihaoa
shabiEOF
EOF

[root@localhost ~]# cat /tmp/out
Hello,world
nihaoa
shabiEOF
[root@localhost ~]#
3、管道

COMMAND1|COMMAND2|COMMAND3|、、、
[root@localhost ~]# who
root     tty1         2015-08-17 14:09
root     pts/1        2015-08-20 09:01 (172.16.11.84)
root     pts/3        2015-08-20 09:26 (172.16.11.84)
[root@localhost ~]# who|wc -l
3
[root@localhost ~]#
4、多道输出:

tee
[root@localhost ~]# cat /etc/issue|tee /tmp/tee.out
CentOS release 6.5 (Final)
Kernel \r on an \m

[root@localhost ~]# cat /tmp/tee.out
CentOS release 6.5 (Final)
Kernel \r on an \m

[root@localhost ~]#


练习:


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: