linux很多管道文件,Linux:Day4(上) 文件管理、管道

文件管理:cp、mv、rm

复制命令:cp

cp [OPTION]... [-T] SOURCE DEST

cp [OPTION]... SOURCE... DIRECTORY

cp [OPTION]... -t DIRECTORY SOURCE...

(1) 源为单个文件

【1】目标不存在:新建目标文件,将源文件内容复制到目标文件中。

【2】目标存在:

目标为文件:用源文件中的内容覆盖目标文件中的内容,无提示!如果想有提示,使用选项 -i。

目标为目录:在目录新建文件名为源文件文件名的文件(如果存在此文件名,则覆盖),然后将源文件中的内容复制到新文件中。

(2) 源为单个目录

复制目录需要使用-r选项,不然报错!

【1】目标不存在:创建指定目录,复制源目录中的所有文件至目标目录。

【2】目标存在:

目标为文件:报错!

目标为目录:在目标目录中创建同源目录名相同的目录,并将文件复制到此目录中

(3) 源为多个文件,不论文件或目录:目标必须存在,且必须是目录。

【1】目标不存在:报错!  cp: target `/tmp/test3' is not a directory

【2】目标存在:

目标为文件:报错!

目标为目录:将源复制到目标目录,如果多个源文件中有目录,则要使用-r选项,不然目录复制不过去,但文件复制正常。

常用选项:

-i:交互式

-r, -R:递归复制目录及内部的所有内容;

-a:归档,相当于-dR   --preserve=all

-d:--no dereference --preserve = links  不追踪符号链接,只保留链接

--preserve [=ATTR_LIST]

mode:权限

ownership:属主属组

timesamp:时间戳

links:

xattr:扩展属性

context:上下文

all:所有元数据

移动文件:mv

(1) 如果源为单个文件,行为和cp一样。

(2) 如果源为单个目录:行为也和CP一样。

目标不存在:和CP一样

目录存在:

目标为文件:报错!提示不能用目录改写非目录文件。

目标为目录:和CP一样

(3) 如果源为多个文件,无论文件或目录:

目标不存在:和CP一样

目标存在:

目标为文件:和CP一样

目村为目录:和CP一样

总结:mv命令和CP是一样,唯一区别是mv不需要使用-r选项。

删除文件:rm,删除文件或目录

删除的是目录:(1) 目录为空,可以删除。 (2) 目录不为空,要用-r或-R选项。

删除的是文件:可以直接删除。

文本编辑器:nano

全屏幕的文件编辑器。

bash的基础特性(2):

1、命令别名(alias)

(1)alias

显示当前shell进程中所有可用的命令别名;

(2)alias NAME="VALUE"  注:后面的值一定要加引号

定义另名NAME,其相当于执行命令VALUE;      例:alias cdnet="cd /etc/sysconfig/network-scripts"

注意:在命令行中定义的别名,仅对当前shell进程有效;如果想永久有效,要定义在配置文件中;

仅对当前用户:~/.bashrc

对所有用户有效:/etc/bashrc

Note:编辑配置给出的新配置不会立即生效;

bash进程重新读取配置文件:

source /path/to/config_file

或. /path/to/config_file

撤消别名:unalias

Note:如果别名同原命令的名称,则如果要执行原命令,可使用 COMMAND

2、glob (globbing)

bash中用于实现文件名“通配”

通配符:*, ?, [ ]

(1) * :代表任意长度的任意字符

(2) ? :任意单个字符

(3) [ ] :匹配指定范围内的任意单个字符

[a-z]:不区分字符大小写

[A-Z]:大写字母

(4) [^ ]:取反

专用字符集合:

[:digit:]:任意数字,相当于0-9,并不是相当于[0-9]

[:lower:]:任意小写字母

[:upper:]:任意大写字母

[:alpha:]:任意大小写字母

[:alnum:]:任意数字和字母

[:space:]:匹配空格

[:punct:]:匹配标点符号

[:graph:]:匹配图形

练习:

1、显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现至少一位数字的文件或目录;

2、显示/etc目录下,以任意一位数字开头,且以非数字结尾的文件或目录;

3、显示/etc/目录下,以非字母开头,后面跟了一个字母及其它任意长度任意字符的文件或目录;

4、复制/etc目录下,所有以m开头,以非数字结尾的文件或目录至/tmp/mageedu目录中;

5、复制/etc目录下,所有以.d结尾的文件或目录至/tmp/magedu.com目录中;

6、复制/etc目录下,所有以.conf结尾,且以m,n,r,p开头的文件或目录至/tmp/mageedu.com目录中;

3、bash的快捷键

Ctrl + l :清屏,相当于clear命令;

Ctrl + a :跳转至命令开始处;

Ctrl + e :跳转至命令结尾处;

Ctrl + c :取消命令人执行;

Ctrl + u :删除命令行首至光标所在处的所有内容;

Ctrl + k :删除光标所在处至命令行尾部的所有内容;

Ctrl + f:光标往后挪一个字符;

Ctrl + b:光标往前挪一个字符;

4、bash的I/O重定向及管道

程序:指令+数据

读入数据:Input

输出数据:Output

打开的文件都有一个fd:file descriptor(文件描述符)

标准输入:keyoard,0

标准输出:monitor,1

标准错误输出:monitor,2

I/O重定向:改变标准位置

输出重定向:COMMAND > NEW_POS,COMMAND >> NEW_POS

>:覆盖重定向,目标文件中的原有内容会被清除;(如果文件不存在则创建)

>>:追加重定向,新内容会追加至目标文件尾部;(如果文件不存在则创建)

# set -C:禁止将内容覆盖输出至已有文件中;文件不存在是可以执行成功的(创建一个新文件),文件存在即使是空的,也是不可以的。

强制覆盖:>|

# set +C:打开可覆盖功能。

2>:覆盖重定向错误输出数据流;

2>>:追加重定向错误输出数据流;

标准输出和错误输出各自定向至不同位置:

COMMAND > /path/to/file.out 2> /path/to/error.out

合并标准输出和错误 输出为同一个数据流进行重定向:

&>:覆盖重定向

&>>:追加重定向

另一种合并输出命令:(这种方式比上面那种更灵活)

COMMAND > /path/to/file.out 2> &1

COMMAND > /path/to/file.out 2>> &1

COMMAND >> /path/to/file.out 2> &1

COMMAND >> /path/to/file.out 2>> &1

输入重定向:

tr命令:转换或删除字符

tr [OPTION]... SET1 [SET2]

例:tr -d abc < /etc/fstab

tr "a-z" "A-Z" < /etc/fstab

注:重定向只能重定向文件,不能将另一个命令的输出结果重定向到另一个命令,如果需要将一个命令的输出结果送给另一个命令,要用下面的管道。(在LINUX中每一个命令都是一个程序,执行后就是一个进程,而进程之间是无法通信的,如果想通信,需要借助于管道。)

例如下面这样是不可以的:

[root@localhost tmp]# tr 'a-z' 'A-Z' < echo "$PATH"

-bash: echo: No such file or directory

HERE Documentation:<

# cat << EOF

# cat > /path/to/somefile << EOF

关于此处的<

此处的<

[root@localhost tmp]# cat> /tmp/cat.out < this is new line?

> yes,it is.>EOF

[root@localhost tmp]# cat/tmp/cat.out

this is new line?yes,itis.

可以看到,内容被写到了指定的文件中,这个没错,但是不用<

[root@localhost tmp]# cat>> /tmp/cat.out

this is another method!

is it OK?

^C

[root@localhost tmp]# cat/tmp/cat.out

this is new line?yes,itis.this is another method!

is it OK?通过上面命令可以看出,使用第二种方法也是OK的,既然不用这种方法也可以实现,为什么还要用第一种方法?感觉这比第一种还简洁一点。

两种方法对比:

(1)第一种在输入的时候前面是有>这个符号,而第二种没有;

(2)第一种是用EOF结束,而第二种用ctrl+c结束;

(3)两种方法输错的时候都需要按shitf+backspace才能删除;

可能由于现在学习还不够深入,对于两种内在的优劣还不明白,留下此问,待以后解决(2018年9月2日)

管道:

COMMAND1 | COMMAND2 | COMMAND3 | ...

Note:最后一个命令会在当前shell进程的子shell进程中执行;

tee命令:从标准输入读数据,输出至标准输出和指定文件。

功能:tee可以放在任何你想截取内容的地方,然后将内容保存到文件中。(但tee的输出是覆盖输出,并不是追加输出)

tee [OPTION]... [FILE]...

示例:

[root@localhost tmp]# echo "$PATH" | tee /tmp/path.out | tr 'a-z' 'A-Z'      不能用单引号

/USR/LIB64/QT-3.3/BIN:/USR/LOCAL/SBIN:/USR/LOCAL/BIN:/SBIN:/BIN:/USR/SBIN:/USR/BIN:/ROOT/BIN

[root@localhost tmp]# cat /tmp/path.out

/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

[root@localhost tmp]# echo "$SHELL" | tee /tmp/path.out | tr 'a-z' 'A-Z'

/BIN/BASH

[root@localhost tmp]# cat /tmp/path.out

/bin/bash

练习:

1、将/etc/passwd文件中的前5行内容转换为大写后保存至/tmp/passwd.out文件中;

2、将登录至当前系统上用户信息中的后3行的信息转换为大写后保存至/tmp/who.out文件中;

文本文件处理工具:wc, cut, sort, uniq

wc命令:word count

wc [OPTION]... [FILE]...

-l:lines,只显示行数

-w:words,只显示单词数

-c:characters,只显示字节数

示例:

[root@localhost tmp]# wc /etc/passwd

33 52 1576 /etc/passwd            -----分别是行数,单词数,字节数(注意:这里的单词仅指用空格分开的字符串,并不是真正的单词)

cut命令:

cut OPTION... [FILE]...

-d DELIMITER:指明分隔符

-f FILEDS:

#:第#个字段

#,#[,#]:离散的多个字段,例如:1,3,6

#-#:,连续的多个字段,例如1-6

混合使用:1-3,7

--output-delimiter=STRING:指明输出时字段之间的分隔符

sort命令:

sort [OPTION]... [FILE]...

-f:忽略字符大小写

-r:逆序显示

-t DELIMITER:指明字段分隔符

-k #:以指定字段为标准进行排序

-n:以数值大小进行排序,默认以字符大小显示的。

-u:uniq,排序后去重

示例:

[root@localhost tmp]# sort -t: -k3 -n /etc/passwd | cut -d: -f3

uniq命令:

uniq [OPTION]... [INPUT [OUTPUT]]

-c:显示每行重复出现的次数;

-d:仅显示重复过的行;

-u:仅显示不曾重复的行;

Note:连续且完全相同方为重复;

练习:以冒号分隔,取出/etc/passwd文件的第6行至第10行,并将这些信息按第3个字段的数值大小进行排序;最后仅显示各自的第1个字段。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值