1-初识 Linux 及文件相关命令

教程 薪牛 ⋅ 于 2023-01-05 15:23:52 ⋅ 1450 阅读

1 Linux 简介

  1. 狭义来说,Linux实际上指Linux kernel (内核)。内核负责管理硬件,并为上层应用提供接口。

  2. 而广义来说,是指以Linux kernel 为基础的,包括OS和各种应用在内的各个Linux版本。简单理解为类似于windows和mac OS一样的操作系统。

  3. Linux 内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的。

    Linux之父:林纳斯·托瓦兹(Linus Torvalds)

file

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

  1. linux 是公认的安全、高性能、稳定、内核开源的系统。
  2. 大数据阶段的所有组件都要安装和运行在装有linux系统的服务器中。
  3. 面试常问
  4. 程序员必备技能

2 在海牛实验室启动linux系统镜像

找到海牛实验室中linux的公用组件,咱们用的linux系统版本是centos7的版本。

实验室中为了方便各位操作,已提供了云主机,后续练习中需要几台linux服务器,直接选择公用的linux组件添加即可。

file

linux服务器的配置可以随着我们实验环境的丰富进行增加,作为最开始练习,我们可以给定一下资源

file

然后点击开始实验,并进入shell终端

file

3 linux目录结构

Linux系统的目录结构图:

file

我们知道Linux的目录结构为树状结构,最顶级的目录为根目录 /。

file

  1. 绝对路径:

路径的写法,由根目录 / 写起,例如: /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与目录相关的命令

  1. pwd

    用于显示当前所在的完整路径

file

  1. mkdir

    用于创建一个目录。

    -p 该选项用于创建多级目录。

#在/opt目录下创建student目录
cd /opt
mkdir /opt/student
#在/opt目录下创建/aaa/bbb/ccc/ddd嵌套目录
mkdir aaa/bbb/ccc/ddd
  1. 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 ~
  1. ls

    用于显示目录 \文件的信息

-a:显示所有的文件夹内容(包括隐藏)

-l:用于显示文件/夹的详细信息

-h:与-l配合使用,可以显示文件的体积大小(自适应单位b,k,m,g ...)

-d:跟上指定的目录时,就会显示该目录的信息,不会显示目录下的文件

#查看根路径下有哪些文件
ls /
#查看根路径下有哪些文件并显示详细信息
ls -l /  #简写成 ll
#查看根路径下文件详细信息并自适应显示文件的大小
ls -l -h / #简写成ls -lh /
#查看/root目录自身的信息
ls -l -d /root
  1. 文件拷贝

    cp [path]/file1 [path]/file2 用于copy(拷贝)文件/夹的命令 如果拷贝的是一个文件夹时,需要配合选项-r来使用

    #将tmp写yum.d文件拷贝到/opt目录下
    cp yum.log /opt
    # 将/opt/student目录拷贝到 / 目录下
    cp -r /opt/student /
  2. 剪切/改名

    剪切: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
  3. touch

    用于创建一个空白的文本文件,也可以修改文件/夹的时间戳

    #在/opt目录下创建一个test文件
    touch /opt/test
  4. 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 命令查看实时日志

file

在客户端2 用 echo “xxx” >> aaa

file

客户端1就能实时的查看到追加进来的数据

file

tail -f 通过ctrl + c 结束

file

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所提供的管道符 “|” 将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为 第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。

file

​ 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
版权声明:原创作品,允许转载,转载时务必以超链接的形式表明出处和作者信息。否则将追究法律责任。来自海汼部落-薪牛,http://hainiubl.com/topics/75975
回复数量: 0
    暂无评论~~
    • 请注意单词拼写,以及中英文排版,参考此页
    • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
    • 支持表情,可用Emoji的自动补全, 在输入的时候只需要 ":" 就可以自动提示了 :metal: :point_right: 表情列表 :star: :sparkles:
    • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif,教程
    • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
    Ctrl+Enter