1 Linux 简介
-
狭义来说,Linux实际上指Linux kernel (内核)。内核负责管理硬件,并为上层应用提供接口。
-
而广义来说,是指以Linux kernel 为基础的,包括OS和各种应用在内的各个Linux版本。简单理解为类似于windows和mac OS一样的操作系统。
-
Linux 内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的。
Linux之父:林纳斯·托瓦兹(Linus Torvalds)
1.1 Linux的特点
开放性,多用户,多任务,可靠的系统安全,良好的可移植性,具有标准兼容性,良好的用户界面(命令界面,图形界面等),出色的速度性能。
开发者操作的系统。
1、开源 | linux内核免费开源 |
---|---|
2、多用户 | 系统可以保证各用户之间的安全、隐私 |
3、多任务 | 同时开启多个应用程序 |
4、良好的界面 | Linux同时具有字符界面(命令行)和图形化界面。 |
5、支持多平台 | 可以在多种硬件平台上安装和运行,如pc或服务器或嵌入式系统。 |
1.2 Linux 发行版本
各个版本之间也只是大同小异,其差别往往体现在客户群、升级维护和界面等方面。
红帽系列
Red Hat Enterprise: (www.redhat.com) 这个是企业级的linux,主要面向服务器。作为商业版,有比较好的配套软件和技术支持。
Fedora: (http://fedoraproject.org) 由社区维护,去除了一些商业软件。红帽实际上赞助了这个项目,以便以此作为技术测试平台。
CentOS: (www.centos.org) 这个版本不来自红帽的公司,是收集红帽公开的源码组成的免费版本,由社区维护,和红帽完全兼容。
SUSE系列
SUSE Linux Enterprise: (www.suse.com) 和红帽商业版类似,德国的发行版本。
openSUSE: (www.opensuse.org) SUSE的免费版本。
Debian系列
Debian: (www.debian.org) 完全免费,社区维护的Linux版本,有很大的用户群,所以遇到问题,基本都可以找到社区用户的支持。
Ubuntu: (www.ubuntu.com) 由一个基金提供支持的免费Linux版本。 继承自Debian。界面很友好。
1.3 为什么要学linux
- linux 是公认的安全、高性能、稳定、内核开源的系统。
- 大数据阶段的所有组件都要安装和运行在装有linux系统的服务器中。
- 面试常问
- 程序员必备技能
2 在海牛实验室启动linux系统镜像
找到海牛实验室中linux的公用组件,咱们用的linux系统版本是centos7的版本。
实验室中为了方便各位操作,已提供了云主机,后续练习中需要几台linux服务器,直接选择公用的linux组件添加即可。
linux服务器的配置可以随着我们实验环境的丰富进行增加,作为最开始练习,我们可以给定一下资源
然后点击开始实验,并进入shell终端
3 linux目录结构
Linux系统的目录结构图:
我们知道Linux的目录结构为树状结构,最顶级的目录为根目录 /。
- 绝对路径:
路径的写法,由根目录 / 写起,例如: /usr/share/doc 这个目录。
2.相对路径:
路径的写法,不是由 / 写起,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成: cd ../man 这就是相对路径的写法啦
- /bin:
这个目录存放着最经常使用的命令。 - /boot:
这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。 - /dev :
dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备 - /etc:
这个目录用来存放所有的系统管理所需要的配置文件和子目录。 - /home:
用户的主目录,在 Linux 中,每个用户都有一个自己的目录 - /lib:
这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。 - /media:
linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下。 - /mnt:
系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容了。 - /opt:
opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。 - /proc:
proc 是 Processes(进程) 的缩写,存储的是当前内核运行状态的一系列特殊文件,我们可以通过直接访问这个目录来获取系统信息。 - /root:
该目录为系统管理员,也称作超级权限者的用户主目录。 - /sbin:
存放的是系统管理员使用的系统管理程序。 - /srv:
该目录存放一些服务启动之后需要提取的数据。 - /tmp:
tmp 是 temporary(临时) 的缩写这个目录是用来存放一些临时文件的。 - /usr:
用户的很多应用程序和文件都放在这个目录下 - /var:
var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。 - /run:
是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。
获取命令帮助:
--help | 命令 --help 优点是:部分命令提供中文,缺点:不是所有的命令都有这个帮助文件 |
---|---|
命令大全手册 | |
问度娘 |
4 和目录相关的命令
4.1与目录相关的命令
-
pwd
用于显示当前所在的完整路径
-
mkdir
用于创建一个目录。
-p 该选项用于创建多级目录。
#在/opt目录下创建student目录
cd /opt
mkdir /opt/student
#在/opt目录下创建/aaa/bbb/ccc/ddd嵌套目录
mkdir aaa/bbb/ccc/ddd
- cd
用于切换目录 . 表示当前目录 .. 表示上级(父级)目录
#切换到root目录
cd /root
#切换到/opt/aaa/bbb/ccc
cd /opt/aaa/bbb/ccc
#/opt/aaa/bbb/ccc目录切换到/opt/aaa/bbb目录
cd ../ 或者 cd /opt/aaa/bbb
#切换到家目录
cd ~
-
ls
用于显示目录 \文件的信息
-a:显示所有的文件夹内容(包括隐藏)
-l:用于显示文件/夹的详细信息
-h:与-l配合使用,可以显示文件的体积大小(自适应单位b,k,m,g ...)
-d:跟上指定的目录时,就会显示该目录的信息,不会显示目录下的文件
#查看根路径下有哪些文件
ls /
#查看根路径下有哪些文件并显示详细信息
ls -l / #简写成 ll
#查看根路径下文件详细信息并自适应显示文件的大小
ls -l -h / #简写成ls -lh /
#查看/root目录自身的信息
ls -l -d /root
-
文件拷贝
cp [path]/file1 [path]/file2 用于copy(拷贝)文件/夹的命令 如果拷贝的是一个文件夹时,需要配合选项-r来使用
#将tmp写yum.d文件拷贝到/opt目录下 cp yum.log /opt # 将/opt/student目录拷贝到 / 目录下 cp -r /opt/student /
-
剪切/改名
剪切:mv [path]/file [path]/
改名:mv fileName1 fileName2
#将/opt下yum.d文件剪切到/home目录 mv /opt/yum.d /home #将/home/yum.d 改名为 demo mv /home/yum.d /home/demo
-
touch
用于创建一个空白的文本文件,也可以修改文件/夹的时间戳
#在/opt目录下创建一个test文件 touch /opt/test
-
rm
-r 表示递归处理 -f 表示强制执行
#删除/opt/test文件 rm /opt/test #删除/opt/student目录 rm -r /opt/studnt #删除/opt/aaa/bbb/ccc/ddd嵌套目录 rm -rf /opt/aaa/bbb/ccc/ddd
4.2 查看文件内容
查看小文件: cat、head、tail
查看大文件:less
4.2.1 查看小文件:cat
适合查看一个屏幕以内数据
命令格式:cat [选项] 文件名
其中参数:
-n:对输出的所有行编号,由1开始对所有输出的行数编号
# 查看文件内容
cat f1
# 查看文件内容,同时输出行编号
cat -n f1
4.2.2 查看文件开头:head
查看文件开头几行,默认是前10行
命令格式:head [选项] 文件名
其中参数: -n 数字:查看前 数字行
# 查看文件前10行内容
head f1
# 查看文件前5行内容
head -n 5 f1
4.2.3 查看文件结尾:tail
1)查看文件结尾
查看文件后几行,默认是后10行
命令格式:tail [选项] 文件名
其中参数: -n 数字:查看后 数字行
# 查看文件后10行内容
head f1
# 查看文件后5行内容
head -n 5 f1
2)实时查看更新的文件内容
用 tail -f 文件名 方式实时监控文件内容是否更新,如果更新,则输出更新的内容。此种方式需要 ctrl+v 退出。
示例:
在客户端1用 tail -f 命令查看实时日志
在客户端2 用 echo “xxx” >> aaa
客户端1就能实时的查看到追加进来的数据
tail -f 通过ctrl + c 结束
4.2.4 查看大文件:less
less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大。
可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜。
命令格式:less [-选项] 文件
命令功能:
使用 less 可以随意浏览文件,而且 less 在查看之前不会加载整个文件。
选项:
-m 显示文件的百分比
-N 显示每行的行号
在文件内的操作命令:
/字符串:向下搜索“字符串”的功能
?字符串:向上搜索“字符串”的功能
n:重复前一个搜索(与 / 或 ? 有关)
N:反向重复前一个搜索(与 / 或 ? 有关)
j:向下滚动一行
k:向上滚动一行
G:跳转到文件尾
g: 跳转到文件头
q:退出
5 linux三剑客
5.1 行筛选:grep
grep是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
命令格式:grep [选项] '搜寻字符串' 文件名
其中:
选项:
-i:不区分大小写
-v: 反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
-n: 顺便输出行号
搜寻字符串:
可以完全匹配字符串
也可以使用正则字符串,利用正则匹配
正则表达式主要参数:
\: 忽略正则表达式中特殊字符的原有含义。
^:匹配正则表达式的行首。
$: 匹配正则表达式的行尾。
[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
. :表示任意单个字符,如 a..b,a12b、aabb都可以。
* :表示有0个或多个 某个字符,如 ab,a必须有,但b可以有0到多个;a,a可以有0到多个,也就是所有。
示例:
# 创建grepf1文件, 内容如下
[root@localhost ~]# vim grepf1
aabbccaa
ddaamm
bbddee
hello world
one world
one dream
# 筛选带有aa的行
[root@localhost ~]# grep aa grepf1
aabbccaa
ddaamm
# 筛选不带有aa的行
[root@localhost ~]# grep -v aa grepf1
bbddee
hello world
one world
one dream
# 筛选以a开头的行
[root@localhost ~]# grep ^a grepf1
aabbccaa
# 筛选以a结尾的行
[root@localhost ~]# grep a$ grepf1
aabbccaa
# 筛选a-c范围的行
[root@localhost ~]# grep [a-c] grepf1
aabbccaa
ddaamm
bbddee
one dream
[root@localhost ~]# grep a.b grepf1
aabbccaa
[root@localhost ~]#
[root@localhost ~]# grep ab. grepf1
aabbccaa
[root@localhost ~]# grep a*b grepf1
aabbccaa
bbddee
[root@localhost ~]# grep ab* grepf1
aabbccaa
ddaamm
one dream
5.2 列筛选:awk
awk 是可以根据指定分隔符来筛选列的数据
命令格式:awk [-F '分隔符'] '{print $n[, $n]}' 文件名
其中:
分隔符:默认分隔符是"空白键" 或 "[tab]键",可以不用 -F 指定
按照指定的$n 来获取指定列的数据,$n 如下:
$0:表示所有列;
$1:表示第一个列;
$n:表示第n个列;
# 创建awkf2文件, 内容如下
[root@localhost ~]# cat awkf2
-rw-------. 1 root root 953 6月 20 2018 anaconda-ks.cfg
drwxr-xr-x. 2 root root 6 8月 11 11:29 dir1
drwxr-xr-x. 4 root root 30 8月 11 11:30 dir2
-rw-r--r--. 1 root root 3 8月 11 15:55 f1
# 筛选 awkf2文件中 第1列数据
# 分隔符是\t([tab]键)
[root@localhost ~]# awk '{print $1}' awkf2
-rw-------.
drwxr-xr-x.
drwxr-xr-x.
-rw-r--r--.
# 筛选 awkf2文件中 第1列、第9列数据
[root@localhost ~]# awk '{print $1, $9}' awkf2
-rw-------. anaconda-ks.cfg
drwxr-xr-x. dir1
drwxr-xr-x. dir2
-rw-r--r--. f1
# 筛选awkf2文件中所有列
[root@localhost ~]# awk '{print $0}' awkf2
-rw-------. 1 root root 953 6月 20 2018 anaconda-ks.cfg
drwxr-xr-x. 2 root root 6 8月 11 11:29 dir1
drwxr-xr-x. 4 root root 30 8月 11 11:30 dir2
-rw-r--r--. 1 root root 3 8月 11 15:55 f1
5.3 sed 搜寻替换文件
5.3.1 搜寻文件内容
sed 搜寻文件语法格式如下:
# 搜寻文件中第N行的数据
sed -n 'Np' 文件名
# 搜寻文件中第N1到N2行的数据
sed -n 'N1,N2p' 文件名
# 搜寻文件中包含字符串sss 的行的数据
sed -n '/sss/p' 文件名
示例:
# 将ip add的命令结果覆盖写入 ip_file
[root@localhost ~]# ip add > ip_file
[root@localhost ~]# cat -n ip_file
1 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
2 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3 inet 127.0.0.1/8 scope host lo
4 valid_lft forever preferred_lft forever
5 inet6 ::1/128 scope host
6 valid_lft forever preferred_lft forever
7 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
8 link/ether 00:0c:29:e3:58:3f brd ff:ff:ff:ff:ff:ff
9 inet 192.168.142.177/24 brd 192.168.142.255 scope global noprefixroute ens33
10 valid_lft forever preferred_lft forever
11 inet6 fe80::20c:29ff:fee3:583f/64 scope link noprefixroute
12 valid_lft forever preferred_lft forever
# 搜寻文件中第5行的数据
[root@localhost ~]# sed -n '5p' ip_file
inet6 ::1/128 scope host
# 搜寻文件中第3到5行的数据
[root@localhost ~]# sed -n '3,5p' ip_file
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
# 搜寻文件中包含 link 的行的数据
[root@localhost ~]# sed -n '/link/p' ip_file
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
link/ether 00:0c:29:e3:58:3f brd ff:ff:ff:ff:ff:ff
inet6 fe80::20c:29ff:fee3:583f/64 scope link noprefixroute
# 搜寻文件第3到5行中,包含 inet 的行的数据
[root@localhost ~]# sed -n '3,5p' ip_file | sed -n '/inet/p'
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
5.3.2 搜寻替换文件内容
sed 搜寻替换文件语法格式如下:
#-----模拟替换-----
# 全局搜寻对应的字符串进行替换,并将替换后的内容输出到屏幕(不修改文件内容)
sed 's/搜寻的字符串/替换的字符串/g' 文件名
# 搜寻N1到N2行中对应的字符串进行替换,并将替换后的内容输出到屏幕(不修改文件内容)
sed 'N1,N2 s/搜寻的字符串/替换的字符串/g' 文件名
#-----真正替换-----
# 全局搜寻对应的字符串进行替换,文件内容修改
sed -i 's/搜寻的字符串/替换的字符串/g' 文件名
# 搜寻N1到N2行中对应的字符串进行替换,文件内容修改
sed -i 'N1,N2 s/搜寻的字符串/替换的字符串/g' 文件名
示例:
# 【模拟替换】全局搜寻inet替换为hhhh,并将替换后的内容输出到屏幕, ip_file文件内容不变
[root@localhost ~]# sed 's/inet/hhhh/g' ip_file
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
hhhh 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
hhhh6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e3:58:3f brd ff:ff:ff:ff:ff:ff
hhhh 192.168.142.177/24 brd 192.168.142.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
hhhh6 fe80::20c:29ff:fee3:583f/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@localhost ~]#
# ip_file文件内容不变
[root@localhost ~]# cat ip_file
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e3:58:3f brd ff:ff:ff:ff:ff:ff
inet 192.168.142.177/24 brd 192.168.142.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fee3:583f/64 scope link noprefixroute
valid_lft forever preferred_lft forever
# 【真正替换】 ip_file文件内容改变
[root@localhost ~]# sed -i 's/inet/hhhh/g' ip_file
[root@localhost ~]# cat ip_file
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
hhhh 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
hhhh6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e3:58:3f brd ff:ff:ff:ff:ff:ff
hhhh 192.168.142.177/24 brd 192.168.142.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
hhhh6 fe80::20c:29ff:fee3:583f/64 scope link noprefixroute
valid_lft forever preferred_lft forever
# 【模拟替换】 搜寻1到2行中link替换为mmmm,并将替换后的内容输出到屏幕
[root@localhost ~]# sed '1,2 s/link/mmmm/g' ip_file
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
mmmm/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
hhhh 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
hhhh6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e3:58:3f brd ff:ff:ff:ff:ff:ff
hhhh 192.168.142.177/24 brd 192.168.142.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
hhhh6 fe80::20c:29ff:fee3:583f/64 scope link noprefixroute
valid_lft forever preferred_lft forever
# 文件并没有改变
[root@localhost ~]# cat ip_file
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
hhhh 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
hhhh6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e3:58:3f brd ff:ff:ff:ff:ff:ff
hhhh 192.168.142.177/24 brd 192.168.142.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
hhhh6 fe80::20c:29ff:fee3:583f/64 scope link noprefixroute
valid_lft forever preferred_lft forever
# 【真正替换】 文件内容改变,但也只改变强两行符合条件的数据
[root@localhost ~]# sed -i '1,2 s/link/mmmm/g' ip_file
[root@localhost ~]# cat ip_file
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
mmmm/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
hhhh 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
hhhh6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e3:58:3f brd ff:ff:ff:ff:ff:ff
hhhh 192.168.142.177/24 brd 192.168.142.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
hhhh6 fe80::20c:29ff:fee3:583f/64 scope link noprefixroute
valid_lft forever preferred_lft forever
6 管道符合:|
利用Linux所提供的管道符 “|” 将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为 第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。
command1正确输出,作为command2的输入,然后comand2的输出作为,comand3的输入,comand3输出就会直接显示在屏幕上面了。
通过管道之后:comand1,comand2的正确输出不显示在屏幕上面。
注意:
1)管道命令只处理前一个命令正确输出,不处理错误输出。
# 筛选 ll 命令的结果中包含dir的行
[root@localhost ~]# ll | grep dir
drwxr-xr-x. 2 root root 6 8月 11 11:29 dir1
drwxr-xr-x. 4 root root 30 8月 11 11:30 dir2
[root@localhost ~]#
# 筛选 ll 命令的结果中第9列
[root@localhost ~]# ll | awk '{print $9}'
anaconda-ks.cfg
awkf2
dir1
dir2
f1
# 筛选ll命令的结果中包含dir的文件名
# 先筛选列,后筛选行
[root@localhost ~]# ll | awk '{print $9}' | grep dir
dir1
dir2
7 输入输出重定向
7.1 输出重定向
对于任何一条linux 命令执行,它会是这样一个过程:
一个命令执行了:
先有一个输入:输入可以从键盘,也可以从文件得到。
命令执行完成:成功了,会把成功结果输出到屏幕:standard output默认是屏幕
命令执行有错误:会把错误也输出到屏幕上面:standard error默认也是指的屏幕
如果想把命令的结果输出的文件,则需要输出重定向符号:
>输出重定向到文件,覆盖写入文件;
>输出重定向到文件,追加写入文件;
三种输入输出的代码分别是:
1)标准输入(stdin);代码为 0 ;
2)标准输出(stdout):代码为 1,不写默认标准输出;
3)错误输出(stderr):代码为 2 ;
下面就有如下输出方式:
1>: 标准输出覆盖写入文件
1>>: 标准输出追加写入文件
2> : 错误输出覆盖写入文件
2>> : 错误输出追加写入文件
# 将上面的命令的结果覆盖写入文件 s1
[root@localhost ~]# ll | awk '{print $9}' | grep dir > s1
[root@localhost ~]# cat s1
dir1
dir2
# 将上面的命令的结果追加写入文件 s1
[root@localhost ~]# ll | awk '{print $9}' | grep dir >> s1
[root@localhost ~]# cat s1
dir1
dir2
dir1
dir2
# 命令报错,错误信息输出到控制台
[root@localhost ~]# ls saf > s2
ls: 无法访问saf: 没有那个文件或目录
[root@localhost ~]# cat s2
# 命令报错,错误信息输出到文件
[root@localhost ~]# ls saf 2> s2
[root@localhost ~]# cat s2
ls: 无法访问saf: 没有那个文件或目录
[root@localhost ~]#
7.2 输入重定向
cat命令的用途是连接文件或标准输入并打印。这个命令常用来显示文件内容,从标准输入读取内容并显示,它常与重定向符号配合使用。
下面简单说明几种使用方式和作用
1)cat << EOF,以EOF输入字符为标准输入结束:
2)cat > filename,创建新文件,并把标准输入输出到filename文件中,以ctrl+d作为输入结束:
3)cat > filename << EOF,以EOF作为输入结束,其中EOF可以是任何字符串,和ctrl+d的作用一样:
一种应用方式:
# 切换到目标用户后执行相应命令并退出, 一般用在shell编程中
su - user3 << EOF
mkdir www
touch wwwf
EOF
8 查找文件或目录:find
在目录中递归查找文件或目录。
命令格式: find [目录] -name 文件或目录名
示例:
# 创建目录lib
[root@worker-1 ~]# mkdir -p xinniu/lib
# 创建目录lib2
[root@worker-1 ~]# mkdir -p xinniu/lib2
# 给lib目录添加文件
[root@worker-1 ~]# touch xinniu/lib/ff1
[root@worker-1 ~]# touch xinniu/lib/ff2
[root@worker-1 ~]# touch xinniu/lib/fm1
[root@worker-1 ~]# touch xinniu/lib/maf
# 给lib2目录添加文件
[root@worker-1 ~]# touch xinniu/lib2/ff3
# 筛选 xinniu目录下文件名包含f的文件路径名(相对路径)
[root@worker-1 ~]# find xinniu -name '*f*'
xinniu/lib/ff1
xinniu/lib/ff2
xinniu/lib/fm1
xinniu/lib/maf
xinniu/lib2/ff3
# 筛选 xinniu目录下文件名包含f的文件路径名(绝对路径)
[root@worker-1 ~]# find /root/xinniu -name '*f*'
/root/xinniu/lib/ff1
/root/xinniu/lib/ff2
/root/xinniu/lib/fm1
/root/xinniu/lib/maf
/root/xinniu/lib2/ff3
注意:find 要查找的目录不能是链接。
[user3@bogon ~]$ ll
drwxrwxr-x. 3 user3 user3 17 4月 7 09:45 m1
lrwxrwxrwx. 1 user3 user3 23 4月 7 09:47 mlink -> /home/user3/m1/m11/m111
#
[user3@bogon ~]$ find -name m111
./m1/m11/m111
# mlink是链接,所以查不出来
[user3@bogon ~]$ find mlink -name m111