关于linux:09Linux基础SHELL标准输入与标准输出重定向管道

41次阅读

共计 21189 个字符,预计需要花费 53 分钟才能阅读完成。

@TOC

09_Linux 根底 -SHELL- 规范输出与规范输入 - 重定向 - 管道


作业
    编辑文本文件 /home/text/file1,分 4 行输出 bbb bbb  bbb、ddd ddd ddd、aaa aaa aaa、ccc ccc ccc。保留不要退出;在末行模式下关上一个新文件 /text/file2;在 file2 中输出内容为 eee eee eee 在这一行内容之后,将 file1 的内容读入到 file2 中,接着在命令模式下依照 abcde 的显示程序调整每行的地位,最初保留退出;同时编辑 file1 和 file2,接着从 file1 切换到 file2,而后 再疾速切换回来,接着将 file2 的内容读到 file1 内容的开端,显示文件 file1 内容的行号,复制 3 到 6 行到 file1 内容的开端;利用替换命令将全文的每行第一个 ccc 都替换为 333;将全文中所有 aaa 都替换为 111,撤销行号,最初不保 存退出;
[root@sanchuang-linux chenpeng]# mkdir /home/text2
[root@sanchuang-linux chenpeng]# cd /home/text2
[root@sanchuang-linux chenpeng]# mkdir /text2
[root@sanchuang-linux text2]# vim file1
:r /text2/file2
aaa aaa aaa
bbb bbb bbb
ccc ccc ccc
ddd ddd ddd
eee eee eee
[root@sanchuang-linux text2]# vim file1 /text2/file2
:n
:N
:set nu
:%s/ccc/333
:%s/aaa/111/g
:set nonu
:q!

练习 1:1. 进入 /lianxi 目录
# cd /lianxi
    2. 复制 /etc/passwd 文件到当前目录下,而后应用 vim 编辑当前目录下的 passwd
# cp /etc/passwd .  # vim passwd
    3. 显示一下行号
:set nu
    4. 复制第 5 到 10 行的内容,粘贴到开端,删除最初一行的最初一个单词
:5 ; 6yy ; G ; p ; dw
    5. 删除第 9 行和第 10 行
:9 ; 2dd
    6. 将 root 改为 gen
:%s/root/gen/g
    7. 删除局部 bash 字符串
:%s/bash//gc
    8. 疾速达到第 5 行,而后再跳到第 1 行,再跳到最初一行
:5 ; :1 ; G
    9. 剪切第 6 - 7 行,粘贴到开端
:6 ; 2dd ; G ; p
    10. 退出并且保留
:wq
    11. 复制 /etc/hosts 文件到当前目录下,将第 1 列的 ip 地址复制,而后粘贴到文件的开端
# /etc/hosts . ; # vim hosts ; ctrl+v ; y ; G ;p

一. SHELL- 规范输出与规范输入

学习内容:重定向和文件目录高级操作

常识要点
输入输出重定向
管道及相干配套命令 数据提取及过滤
文件差别比照和补丁生成及打补丁

规范输出和规范输入

知识点 1 规范输出和规范输入

---------------------------
输入输出及重定向
每个过程根本都会关上三个文件描述符
0:规范输出(从键盘)1:规范输入(输入到屏幕)2:规范谬误输入(输入到屏幕)类型            设施文件        文件描述符(fd)默认设施
规范输出      /dev/stdin      0                  键盘
规范正确输入     /dev/stdout     1                显示器
规范谬误输入     /dev/stderr     2                显示器
-------------------------------------------------------
规范输出(stdin)和规范输入(stdout)------------------------------------
python 中 >>>help(print) file=sys.stdout 默认输入到屏幕(规范输入)------------------------------------------------------------------
过程:正在进行的程序
---------------------
键盘 =》规范输出 =》终端程序 =》规范输入     =》显示器
                            规范谬误输入 =》显示器
----------------------------------------------------------
https://blog.csdn.net/xiaofei0859/article/details/78448493?utm_source=blogxgwz9
每个过程根本都会关上三个文件描述符
0: 规范输出(从键盘、语音、人脸识别……)1: 规范输入(输入到屏幕)2: 规范谬误输出(输入到屏幕)---------------------------
文件描述符:fd  就是每个过程关上的文件

文件描述符

知识点 1.1 文件描述符

文件描述符:linux 内核给每个过程都发明一个文件描述符,这个表里记录了这个过程所关上的所有文件,为了不便过程晓得本人关上了哪些文件呢,就给每个文件都进行了标号,这个编号就是文件描述符。尔后,所有对文件的操作,就是用该编号。

linux 上面所有皆文件

知识点 1.2 linux 上面所有皆文件

linux 上面所有皆文件

disk 磁盘

/dev 目录上面根本都是块设施文件

[root@sanchuang-linux ~]# cd /dev
[root@sanchuang-linux dev]# cd disk
[root@sanchuang-linux disk]# ls
by-id  by-label  by-partuuid  by-path  by-uuid
[root@sanchuang-linux disk]# cd ..
[root@sanchuang-linux dev]# ls -ld sda1
brw-rw----. 1 root disk 8, 1 10 月  6 17:16 sda1
[root@sanchuang-linux dev]# ls -ld sda2
brw-rw----. 1 root disk 8, 2 10 月  6 17:16 sda2
------------------------------------------------
[root@sanchuang-linux dev]# cd net
[root@sanchuang-linux net]# ls
tun
[root@sanchuang-linux net]# 
----------------------------
对文件的操作就是对设施的操作
----------------------------
[root@sanchuang-linux ~]# cd /dev
[root@sanchuang-linux dev]# ls
stderr
stdin
Stdout
fd
……
---------------------------------
[root@sanchuang-linux ~]# cd /dev
[root@sanchuang-linux dev]# cd fd
[root@sanchuang-linux fd]# ls
0  1  2  255 
[root@sanchuang-linux fd]# ls -al
总用量 0
dr-x------. 2 root root  0 10 月 16 10:40 .
dr-xr-xr-x. 9 root root  0 10 月 16 10:40 ..
lrwx------. 1 root root 64 10 月 16 10:40 0 -> /dev/pts/6    #(注:链接的意思,快捷方式 指向                                                                                    /dev/pts/6,规范输出到虚构终端 6)lrwx------. 1 root root 64 10 月 16 10:40 1 -> /dev/pts/6    #(注:规范输入到虚构终端 6)lrwx------. 1 root root 64 10 月 16 10:40 2 -> /dev/pts/6    #(注:规范谬误输入到虚构终端 6)lrwx------. 1 root root 64 10 月 16 11:24 255 -> /dev/pts/6
[root@sanchuang-linux fd]# 
---------------------------------------

虚构终端 pts 实在终端 tty

知识点 1.3 虚构终端 pts 实在终端 tty

[root@sanchuang-linux dev]# cd /dev/pts
[root@sanchuang-linux pts]# ls
0 1 2 3 4 5 6 ptmx
[root@sanchuang-linux pts]#

pts 是他人连贯到服务器的虚构终端(近程管制)。他人近程连贯会创立虚构终端

pts 虚构终端

-----------------------------------------------------
Linux centos 登录——》本地的终端 shell 环境  实在终端
xshell 连贯       ——》虚构终端
--------------------------------
tty 本地实在终端
[root@sanchuang-linux dev]# cd /dev
[root@sanchuang-linux dev]# ls
tty

查看以后 linux 登陆的用户状况

知识点 1.4 查看以后 linux 登陆的用户状况

查看以后 linux 登陆的用户状况 # w

[root@sanchuang-linux dev]# w
11:32:52 up 16:23, 4 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 – 0610 月 20 1:32m 0.60s 0.60s -bash (注:bash 环境)
root pts/1 192.168.0.26 10:03 25:40 0.21s 0.21s -bash (注:bash 环境)
root pts/2 10.122.155.164 08:52 2:29m 0.16s 0.13s vim -r a (注:删除环境)
root pts/6 192.168.0.26 10:40 4.00s 0.09s 0.01s w (注:输出 w 命令环境)

———-↓解释 —————————————————————————-

USER:登录用户

TTY:终端类型 terminal type 面向用户应用的接口

    `tty1: 实在终端 `

            tty1==>` 间接登录进去 操纵的第一个终端 `(实在终端)Linux 里最多容许 `6 个 ` 能够间接登录的终端(即 ` 实在终端 tty`)tty2~tty6 须要的时候应用

            `Alt+F1` tty1 回到第一个终端

            `Alt+F2` tty2 回到第二个终端

    `pts/1: 虚构终端 `,给他人用的。数量能够有很多个。有近程登录过去的时候,就会创立 1 个终端

FROM:从哪里来

WHAT:做什么事

load average 机器的拼接负载

——————————

[root@sanchuang-linux dev]# w
11:39:04 up 16:29, 4 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 – 0610 月 20 1:38m 0.60s 0.60s -bash
root pts/1 192.168.0.26 10:03 31:52 0.21s 0.21s -bash
root pts/2 10.122.155.164 08:52 2:35m 0.16s 0.13s vim -r a
root pts/6 192.168.0.26 10:40 0.00s 0.09s 0.00s w
[root@sanchuang-linux dev]# date
2020 年 10 月 16 日 星期五 11:39:06 CST

load average 机器的均匀负载

—————————

本地终端(实在终端)的创立、切换

知识点 1.5 本地终端(实在终端)的创立、切换

Alt+F2

本地最多能登录 6 个终端

Alt+F1~F6 切换本地登录的终端(实在终端)

—————————————–

Alt+F2、Alt+F6

[root@sanchuang-linux dev]# w
11:42:06 up 16:32, 6 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 – 0610 月 20 1:41m 0.60s 0.60s -bash
root pts/1 192.168.0.26 10:03 34:54 0.21s 0.21s -bash
root pts/2 10.122.155.164 08:52 2:38m 0.16s 0.13s vim -r a
root pts/6 192.168.0.26 10:40 3.00s 0.09s 0.00s w
root tty2 – 11:40 1:50 0.01s 0.01s -bash
root tty6 – 11:41 13.00s 0.01s 0.01s -bash

如何拦挡虚构终端

知识点 1.6 如何拦挡虚构终端

如何拦挡虚构终端 # kill -9 pid

-----------------------------------
[root@sanchuang-linux dev]# ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.7 179304 13536 ?        Ss   10 月 15   0:07 /usr/lib/systemd/systemd --switched-root --system --dese
root        1450  0.0  0.2  25588  3996 tty1     Ss+  10 月 15   0:00 -bash
root       12692  0.0  0.2  34480  4444 ?        Ss   04:49   0:00 tmux
……………………………………………………
root       13025  0.0  0.2  25588  4048 pts/14   Ss+  05:14   0:00 -bash
root       13046  0.0  0.2  25588  4032 pts/15   Ss+  05:14   0:00 -bash
root       13286  0.0  0.2  25588  3940 pts/0    Ss+  05:28   0:00 -bash
root       13614  0.0  0.2  25588  4016 pts/3    Ss+  06:23   0:00 -bash
root       13635  0.0  0.2  25588  3956 pts/4    Ss   06:23   0:00 -bash
root       13657  0.0  0.4  48860  8596 pts/4    S+   06:24   0:00 vim /home/text/file2
[root@sanchuang-linux dev]# kill -9 13046(注:杀死 pid 号 13046 的过程)------------------------------------------------------------------------
ssh 服务  22 号端口  有端口必定有服务
起服务肯定要有端口
端口跟服务挂钩

Mysql 默认端口 3306

查看服务的默认端口

知识点 1.7 查看服务的默认端口

怎么查看服务的默认端口 # less /etc/services

查看服务的默认端口

# less /etc/services
tcpmux          1/tcp                           # TCP port service multiplexer
tcpmux          1/udp                           # TCP port service multiplexer
rje             5/tcp                           # Remote Job Entry
rje             5/udp                           # Remote Job Entry
…………

知识点 1.8 传输层协定 TCP、UDP

传输层协定 TCP、UDP

杀死连贯 限度连贯

知识点 1.9 杀死连贯 限度连贯

杀死连贯:

ps aux 查看 pts 的连贯 pid

而后应用:kill -9 xxx

————————-

限度连贯:

iptables 防火墙

或应用其余 ssh 相干的限度

————————-

/proc 目录

知识点 2.0 /proc 目录

/Proc 目录 放一些正在运行的程序

\# ls /proc 正在运行的程序

[root@sanchuang-linux ssh]# ls /proc
………………………………………………(删了很多)11     13657  1450   158  171  186  29  508  632  906  999        fb           loadavg       self           zoneinfo
13025  14438  15     168  182  23   40  6    859  982  diskstats  kmsg         partitions    tty
………………………………………………(删了很多)

查看过程关上了哪些文件描述符

知识点 2.1 查看过程关上了哪些文件描述符 proc/1450/fd

查看过程关上了哪些文件描述符

[root@mysql-binary fd]# ls

0 1 2 255

[root@mysql-binary fd]# pwd

/proc/1680/fd

-----------------------------------------
[root@sanchuang-linux ssh]# cd /proc/1450
[root@sanchuang-linux 1450]# ls
attr        comm             fd        map_files   net            pagemap      schedstat     
………………………………(删了很多)[root@sanchuang-linux 1450]# cd fd
[root@sanchuang-linux fd]# ls
0  1  2  255  3  4
[root@sanchuang-linux fd]# pwd
/proc/1450/fd

二. 重定向

重定向:扭转规范输出、规范输入的方向就是重定向

——————————————————————————————–

类型 操作符 用处

重定向规范 输入 > 将命令的执行后果 输入到指定的文件 中,而不是间接显示在屏幕上

                            \>>            将命令执行的后果 ` 追加输入到指定文件 `

重定向规范 输出 < 将命令中 接管输出的路径 由默认的键盘 更改 为指定的文件

echo

知识点 3.1 echo

echo -n 不接换行

echo -e 转义字符输入

[root@sanchuang-linux redirect]# echo "xxx"
xxx
[root@sanchuang-linux redirect]# echo -n "xxx"
xxx[root@sanchuang-linux redirect]#
[root@sanchuang-linux redirect]# echo "xx \n x1x1"
xx \n x1x1
[root@sanchuang-linux redirect]# echo -e "xx \n x1x1"
xx 
 x1x1
[root@sanchuang-linux redirect]# 
---------------------------------
echo -n 不接换行
echo -e 转义字符输入

重定向(扭转原来的输入形式)

知识点 3.2 重定向(扭转原来的输入形式)

重定向(扭转原来的输入形式)

[root@sanchuang-linux redirect]# echo "xxx" >file.txt
[root@sanchuang-linux redirect]# cat file.txt
xxx

脚本运行 规范谬误输入、规范正确输入(显示)

知识点 3.3 脚本运行 规范谬误输入、规范正确输入(显示)

脚本一行一行 从上到下执行

[root@sanchuang-linux redirect]# vim test.sh
[root@sanchuang-linux redirect]# cat test.sh
t
date
[root@sanchuang-linux redirect]# sh test.sh
test.sh: 行 1: t: 未找到命令
2020 年 10 月 16 日 星期五 14:49:40 CST

——————————————–

注↑:标注谬误输入、失常输入

重定向

知识点 3 重定向

重定向:扭转规范输出、规范输入的方向就是重定向

——————————————————————————————–

类型 操作符 用处

重定向规范 输入 > 将命令的执行后果 输入到指定的文件 中,而不是间接显示在屏幕上

                            \>>            将命令执行的后果 ` 追加输入到指定文件 `

重定向规范 输出 < 将命令中 接管输出的路径 由默认的键盘 更改 为指定的文件

——————————————————————————————–

操作如下

知识点 3.4 # sh test.sh > test_result.txt

规范谬误输入不会重定向到文件,正确输入会重定向到文件

[root@sanchuang-linux redirect]# vim test.sh
[root@sanchuang-linux redirect]# cat test.sh
t
date
[root@sanchuang-linux redirect]# sh test.sh
test.sh: 行 1: t: 未找到命令
2020 年 10 月 16 日 星期五 14:49:40 CST
[root@sanchuang-linux redirect]# sh test.sh > test_result.txt
test.sh: 行 1: t: 未找到命令 (注:规范谬误输入显示在屏幕上,不重定向到文件)
[root@sanchuang-linux redirect]# cat test_result.txt
2020 年 10 月 16 日 星期五 14:50:32 CST(注:正确输入会重定向到文件)

\=\=\=\=\=\=\==\=\=\=\=\=\=\==\=\=\=\=\=\=\==\=\=\=\=\=\=\=\==\=\=\=\=\=\=\=\==\=\=\=\=\=\=\==\=\=\=\=\=\=\=

重定向 > 默认只会重定向规范输入

重定向 规范谬误

知识点 3 重定向 规范谬误

规范谬误:通过该设施报告执行出错信息

——————————————————————————————–

类型 操作符

重定向规范谬误 2>

                                                                        2>>

重定向 规范输入和规范谬误 同一个文件 2>&1 或者 >& 或者 &>

重定向 规范输入和规范谬误 不同文件 > 文件 1 2 > 文件 2(没教)

——————————————————————————————–

操作如下

知识点 3.5.1 # sh test.sh 2> test_result.txt

\# sh test.sh 2> test_result.txt 重定向规范谬误 (注:与 > 成果相同)

正确输入显示在屏幕上,规范谬误输入重定向到文件

只输入了谬误的

[root@sanchuang-linux redirect]# sh test.sh 2> test_result.txt
2020 年 10 月 16 日 星期五 14:52:33 CST(注:正确输入显示在屏幕上)
[root@sanchuang-linux redirect]# cat test_result.txt
test.sh: 行 1: t: 未找到命令(注:规范谬误输入重定向到文件)


知识点 3.5.2 # sh test.sh &> test_result.txt

\# sh test.sh &> test_result.txt

把正确的谬误的都重定向到 文件

[root@sanchuang-linux redirect]# sh test.sh &> test_result.txt
[root@sanchuang-linux redirect]# cat test_result.txt
test.sh: 行 1: t: 未找到命令
2020 年 10 月 16 日 星期五 14:54:05 CST

与上面成果雷同


知识点 3.5.3 # sh test.sh > test_result.txt 2>&1

\# sh test.sh > test_result.txt 2>&1

把谬误输入重定向向到规范输入

[root@sanchuang-linux redirect]# sh test.sh > test_result.txt 2>&1
[root@sanchuang-linux redirect]# cat test_result.txt
test.sh: 行 1: t: 未找到命令
2020 年 10 月 16 日 星期五 14:55:16 CST

两者成果等同


知识点 3.5.4 # sh test.sh > test_result.txt 1>&2

\# sh test.sh > test_result.txt 1>&2

把规范输入重定向谬误输入

* 输入到屏幕上(* 注:不重定向到文件)

[root@sanchuang-linux redirect]# sh test.sh > test_result.txt 1>&2
test.sh: 行 1: t: 未找到命令(注:输入到屏幕上)
2020 年 10 月 16 日 星期五 14:56:19 CST(注:输入到屏幕上)

[root@sanchuang-linux redirect]# cat test_result.txt
[root@sanchuang-linux redirect]#

应用重定向清空文件的几种形式

知识点 3.6 应用重定向清空文件的几种形式

应用重定向清空文件的几种形式:

\# >stdout_test.txt

\# echo >stdout_test.txt(注:有空格)

\# echo "">stdout_test.txt(注:有空格)

\# :>stdout_test.txt

\# echo -n "" > stdout_test.txt

代码如下

——————————————————————————————–

[root@sanchuang-linux redirect]# vim stdout_test.txt
[root@sanchuang-linux redirect]# >stdout_test.txt(注:清空)
[root@sanchuang-linux redirect]# cat stdout_test.txt
[root@sanchuang-linux redirect]# echo “aaa”> stdout_test.txt
[root@sanchuang-linux redirect]# cat stdout_test.txt
aaa
[root@sanchuang-linux redirect]# echo >stdout_test.txt(注:有空格)
[root@sanchuang-linux redirect]# cat stdout_test.txt

[root@sanchuang-linux redirect]# echo “aaa”>stdout_test.txt
[root@sanchuang-linux redirect]# echo "">stdout_test.txt(注:有空格)
[root@sanchuang-linux redirect]# cat stdout_test.txt

[root@sanchuang-linux redirect]# echo “aaa”>stdout_test.txt
[root@sanchuang-linux redirect]# :>stdout_test.txt(注:清空)
[root@sanchuang-linux redirect]# cat stdout_test.txt

[root@sanchuang-linux chenpeng]# echo -n "" > stdout_test.txt(注:清空)
[root@sanchuang-linux chenpeng]# cat stdout_test.txt
[root@sanchuang-linux chenpeng]#


知识点 3.6.1 # echo -n "">stdout_test.txt

\# echo -n "">stdout_test.txt

echo 默认状况会接一个换行符 不想换行 接 -n

[root@sanchuang-linux redirect]# echo “aaa”>stdout_test.txt
[root@sanchuang-linux redirect]# cat stdout_test.txt
aaa
[root@sanchuang-linux redirect]# echo “”>stdout_test.txt
[root@sanchuang-linux redirect]# cat stdout_test.txt (注:有空格)

[root@sanchuang-linux redirect]# echo -n "">stdout_test.txt (注:清空,没有空格)
[root@sanchuang-linux redirect]#

重定向 > 与 >>

知识点 3.7 重定向 > 与 >>

重定向 > 与 >>

> 是以 笼罩 的形式写入

>> 是以 追加 的形式写入

代码如下

——————————————————————————————–

[root@sanchuang-linux redirect]# echo "aaa" > stdout_test.txt

[root@sanchuang-linux redirect]# cat stdout_test.txt
aaa
[root@sanchuang-linux redirect]# echo "bb" >> stdout_test.txt
[root@sanchuang-linux redirect]# cat stdout_test.txt
aaa
bb
[root@sanchuang-linux redirect]#

重定向规范输出 read 输出

知识点 3.8 重定向规范输出 read 输出

重定向规范输出 read 输出

(注:用到了 tmux)

While 循环

echo “$a $b $c

脚本 1 3 个参数 3 个参数
[root@sanchuang-linux redirect]# cat abc.sh
while read a b c
do
    echo "$a    $b    $c"
done < f1.txt
[root@sanchuang-linux redirect]#(注:窗口 1)──────────────────────────────────────────────
[root@sanchuang-linux redirect]# vim f1.txt
[root@sanchuang-linux redirect]# cat f1.txt
xx yy zz
aa bb cc(注:窗口 2)──────────────────────────────────────────────
[root@sanchuang-linux redirect]# sh abc.sh
xx    yy    zz
aa    bb    cc

[root@sanchuang-linux redirect]#(注:窗口 3)

echo “$a -- $b

脚本 2 2 个参数 3 个参数
[root@sanchuang-linux redirect]# vim abc.sh
[root@sanchuang-linux redirect]# cat abc.sh
while read a b
do
    echo "$a -- $b"
done < f1.txt
[root@sanchuang-linux redirect]#(注:窗口 1)──────────────────────────────────────────────
[root@sanchuang-linux redirect]# vim f1.txt
[root@sanchuang-linux redirect]# cat f1.txt 
xx yy zz
aa bb cc
[root@sanchuang-linux redirect]#(注:窗口 2)──────────────────────────────────────────────(注:默认空格宰割参数,xx 和 yy zz)[root@sanchuang-linux redirect]# sh abc.sh 
xx -- yy zz
aa -- bb cc
[root@sanchuang-linux redirect]#(注:窗口 3)

echo “line:$line

脚本 3 1 个参数 3 个参数
[root@sanchuang-linux redirect]# vim abc.sh
[root@sanchuang-linux redirect]# cat abc.sh 
while read line 
do
    echo "line:$line"
done < f1.txt
[root@sanchuang-linux redirect]#(注:窗口 1)──────────────────────────────────────────────
[root@sanchuang-linux redirect]# vim f1.txt
[root@sanchuang-linux redirect]# cat f1.txt 
xx yy zz
aa bb cc
[root@sanchuang-linux redirect]#(注:窗口 2)──────────────────────────────────────────────
[root@sanchuang-linux redirect]# sh abc.sh 
line:xx yy zz
line:aa bb cc
[root@sanchuang-linux redirect]#(注:窗口 3)

echo “$a -- $b -- $c -- $d -- $e

脚本 4 5 个参数 3 个参数
[root@sanchuang-linux redirect]# vim abc.sh
[root@sanchuang-linux redirect]# cat abc.sh 
while read a b c d e 
do
    echo "$a -- $b -- $c -- $d -- $e"
done < f1.txt
[root@sanchuang-linux redirect]#(注:窗口 1)──────────────────────────────────────────────
[root@sanchuang-linux redirect]# vim f1.txt
[root@sanchuang-linux redirect]# cat f1.txt 
xx yy zz
aa bb cc
[root@sanchuang-linux redirect]#(注:窗口 2)──────────────────────────────────────────────
[root@sanchuang-linux redirect]# sh abc.sh 
xx -- yy -- zz --  -- 
aa -- bb -- cc --  -- 
[root@sanchuang-linux redirect]#(注:窗口 3)=================================

知识点 3.9 上课练习 重定向规范输出 read 输出

[root@sanchuang-linux redirect]# vim student_information.sh
[root@sanchuang-linux redirect]# cat student_information.sh 
echo "======== 学生信息管理系统 ==============="
while read name sex age
do
    echo "== 姓名:$name, 性别:$sex, 年龄:$age=="
done < stu_info.txt
echo "========================================"
[root@sanchuang-linux redirect]#(注:窗口 1 tmux)──────────────────────────────────────────────
[root@sanchuang-linux redirect]# cat stu_info.txt
wenyao 18 f
fengcheng 78 m
chenpeng 80 m
[root@sanchuang-linux redirect]#(注:窗口 2 tmux)──────────────────────────────────────────────
[root@sanchuang-linux redirect]# sh student_information.sh 
======== 学生信息管理系统 ===============
== 姓名:wenyao, 性别:18, 年龄:f==
== 姓名:fengcheng, 性别:78, 年龄:m==
== 姓名:chenpeng, 性别:80, 年龄:m==
========================================
[root@sanchuang-linux redirect]#(注:窗口 3 tmux)

三. SHELL- 脚本练习及管道

知识点 4.0 承受从键盘的输出 管道符号

脚本 承受从键盘的输出

要求:输出用户名和明码 创立相应的用户

需要剖析:承受用户输出

                创立用户

                设置明码

—– 相干知识点 ———————————-

管道符号 |:上一条命令的输入作为下一条命令的输出

yum list 默认输入到屏幕

yum list | grep tmux yumlist 的输入 作为 grep tmux 命令的输出


创立用户 useradd wy
[root@sanchuang-linux ~]# useradd wy
[root@sanchuang-linux ~]# passwd wy
更改用户 wy 的明码。新的 明码:有效的明码:明码少于 8 个字符
从新输出新的 明码:passwd:所有的身份验证令牌曾经胜利更新。==============================================================
从新给用户 wy 设置明码
[root@sanchuang-linux ~]# echo "yyyzzz123" |passwd wy --stdin
stdin 规范输出

*4.1 初始脚本 1

(注:# passwd 在 bash 中执行时会在两头进行,让用户进行输出明码

    \# ` 为了避免 shell 停止使用参数 --stdin`,让 passwd 介绍规范输出,echo 是规范输入

    来自:https://blog.csdn.net/qq_31820885/article/details/78100587)
[root@sanchuang-linux chenpeng]# vim test.sh
read -p "请输出用户名:" username
read -p "请设置明码:" password

useradd $username
echo $password | passwd $username --stdin
echo $username
echo $password

[root@sanchuang-linux chenpeng]# sh test.sh
请输出用户名:cp1
请设置明码:123456
更改用户 cp1 的明码。passwd:所有的身份验证令牌曾经胜利更新。cp1
123456
[root@sanchuang-linux chenpeng]# id cp1
uid=1009(cp1) gid=1009(cp1) 组 =1009(cp1)
[root@sanchuang-linux chenpeng]# less /etc/passwd
root:x:0:0:root:/root:/bin/bash
………………
wy:x:1008:1008::/home/wy:/bin/bash
cp1:x:1009:1009::/home/cp1:/bin/bash

\=\=\=\=\=\=\=\=\==\=\=\=\=\=\=\==\=\=\=\=\=\==\=\=\=\=\=\=\=\==\=\=\=\=\=\==\=\=\=\=\=\=\==\=\=\=\=\=\=\==\=\=\=\==\=\=\=\=\==\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=

*4.2 python 与 shell 程序运行出错

python 中如果程序运行中呈现谬误,后续操作会终止

shell 中如果呈现谬误,操作会持续向下执行

*4.3 优化脚本 2

用户创立脚本优化:

1. 让命令的规范输入和规范谬误输入都输入到黑洞文件

echo $password | passwd $username –stdin &>/dev/null

2. 明码暗藏 -s

read -s -p “ 请设置明码:” password

3. 判断用户是否存在

条件语句:

if 条件 then

    ` 语句体 1`

else

    ` 语句体 2`

fi

*4.3 优化脚本 2

[root@sanchuang-linux chenpeng]# vim test.sh
read -p "请输出用户名:" username

if cat /etc/passwd |grep $username &>/dev/null
then
    echo "$username is exist!"
else
    read -s -p "请设置明码:" password
    useradd $username &>/dev/null
    echo $password | passwd $username --stdin &>/dev/null
    echo -e "\n create $username ok!"
fi

----------------------------------------------------------
[root@sanchuang-linux chenpeng]# sh test.sh 
请输出用户名:cp1
cp1 is exist!
[root@sanchuang-linux chenpeng]# sh test.sh 
请输出用户名:cp8
请设置明码:create cp8 ok!
[root@sanchuang-linux chenpeng]# 

4.3.2 脚本优化 3

[root@sanchuang-linux chenpeng]# vim test.sh
read -p "请输出用户名:" username

if cat /etc/passwd |grep $username &>/dev/null
then
    echo "$username is exist!"
else
    read -s -p "请设置明码:" password
    useradd $username &>/dev/null
    echo $password | passwd $username --stdin &>/dev/null
    echo -e "\n create $username ok!"
fi(tmux 窗口 1)──────────────────────────────────────────────
[root@sanchuang-linux chenpeng]# sh test.sh 
请输出用户名:chen5556
chen5556 is exist!
[root@sanchuang-linux chenpeng]# sh test.sh 
请输出用户名:chen7778
请设置明码:create chen7778 ok!
[root@sanchuang-linux chenpeng]#(tmux 窗口 2)

4.3.4 脚本改善 最终版

[root@sanchuang-linux chenpeng]# id chen5557
uid=1019(chen5557) gid=1019(chen5557) 组 =1019(chen5557)

——————————————————–

[root@sanchuang-linux chenpeng]# vim test.sh
read -p "请输出用户名:" username

if id $username &>/dev/null
then
   echo "$username is exist!"
else
   read -s -p "请设置明码:" password
   useradd $username &>/dev/null
   echo $password | passwd $username --stdin &>/dev/null
   echo -e "\n create $username ok!"
fi(tmux 窗口 1)──────────────────────────────────────────────
[root@sanchuang-linux chenpeng]# sh test.sh 
请输出用户名:chen5556
chen5556 is exist!
[root@sanchuang-linux chenpeng]# sh test.sh 
请输出用户名:chen7777
请设置明码:
 create chen7777 ok!
[root@sanchuang-linux chenpeng]#(tmux 窗口 2)

查看用户是否存在

*4.4 查看用户是否存在

[root@sanchuang-linux ~]# cat /etc/passwd |grep cp1
cp1: x:1009:1009::/home/cp1:/bin/bash

上一条命令返回值 $?

*4.5 上一条命令返回值 $?

$? 上一个命令的返回值

上一条命令返回值:保留在 –>$?

为 0 是胜利

为 1 是失败

命令返回值为 0 示意执行胜利

                    `1  执行失败 `

                    `227  没有这条命令 `

命令返回值 $?


*4.6 命令返回值 不准确的判断用户是否存在

不精确地判断用户是否存在

[root@sanchuang-linux ~]# cat /etc/passwd |grep cp1(注:不精确地判断用户是否存在)
cp1: x:1009:1009::/home/cp1:/bin/bash
[root@sanchuang-linux ~]# echo $?(注:为 0 是胜利)
0
[root@sanchuang-linux ~]# cat /etc/passwd |grep cp9
[root@sanchuang-linux ~]# echo $?(注:为 1 是失败)
1

\=\=\=\=\=\==\=\=\=\=\==\=\=\=\=\==\=\=\=\=\=\=\=\=\==\=\=\=\=\=\==\=\=\=\=\=\=\=\=\=\==\=\=\=\=\=\=\==

命令返回值 id

[root@sanchuang-linux ~]# id cp1
uid=1009(cp1) gid=1009(cp1) =1009(cp1)
[root@sanchuang-linux ~]# echo $?
0
[root@sanchuang-linux ~]# id cp9
id:“cp9”:无此用户
[root@sanchuang-linux ~]# echo $?
1
[root@sanchuang-linux ~]#

上一条命令返回值:保留在 ——>$?

——————————————————–

命令返回值为 0 示意执行胜利

                    `1  执行失败 `

                    `227  没有这条命令 `

*4.7 准确的判断用户是否存在(欠缺脚本)

想要准确匹配的话,就把过滤的范畴放大一点:

^wy: 以 wy: 结尾

^…:以什么结尾,整行以什么结尾

…$:以什么结尾,整行以什么结尾

[root@sanchuang-linux ~]# cat /etc/passwd |grep "^wy:"
wy: x:1008:1008::/home/wy:/bin/bash

[root@sanchuang-linux ~]# useradd wy:
useradd:有效的用户名“wy:”

wc 命令 < 重定向规范输出

知识点 5.1 wc 命令 < 重定向规范输出

wc(字数统计)命令

格局:wc [选项]... 指标文件...

-l:统计行数

-w:统计字数(前后都是空白的一组字符)

-c:统计字符数(可见和不可见的字符)

例:

\# wc /etc/hosts

4 23 185 /etc/hosts

(* 注:4 行,23 个单词,185 个字节)

代码如下

—————————————————————

[root@sanchuang-linux ~]# wc -l backup_log.sh(注:查看文件有多少行)
0 backup_log.sh
[root@sanchuang-linux ~]# wc < backup_log.sh(输出重定向)
0 0 0
[root@sanchuang-linux ~]# wc backup_log.sh
0 0 0 backup_log.sh

[root@sanchuang-linux lianxi]# wc -l sshd_config2(注:查看文件有多少行)
148 sshd_config2
[root@sanchuang-linux lianxi]# wc < sshd_config2(注:规范输出 输出重定向
148 559 4425
[root@sanchuang-linux lianxi]# wc sshd_config2(注:wc(字数统计) 命令)
148 559 4425 sshd_config2


知识点 5.2 重定向 发信息 echo “hello brother” > /dev/pts/22

[root@sanchuang-linux ~]# w
17:20:37 up 19:51, 7 users, load average: 0.00, 0.00, 0.02
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 – 0610 月 20 7:20m 0.60s 0.60s -bash
root pts/7 192.168.0.30 14:30 42:37 0.09s 0.00s tmux
root pts/21 192.168.0.30 16:48 21.00s 0.14s 0.14s -bash
root pts/22 192.168.0.30 17:20 0.00s 0.02s 0.01s w

———————————————————————-

\# echo "hello brother" > /dev/pts/22

重定向 发信息

xargs 管道符号

知识点 5.3 xargs 管道符号

xargs 将后面命令的 输入 送给前面的命令 作为参数 应用

xargs 和 管道符号 个别配套应用

————————————————-

在以后门路查看.txt 结尾的文件

find . -name “*.txt”

————————————

管道 与 xargs

将管道前的输入作为参数赋给前面的命令

find . -name "*.txt" | xargs rm -rf

————————————————————————————–

管道与 xargs

xargs 能够将管道或规范输出(stdin)数据转换成命令行参数,也可能从文件的输入中读取数据。

[root@mysql-binary vim_test]# find . -name “*.sh” |xargs ls -al

[root@mysql-binary vim_test]# find . -name “*.txt” | xargs rm -rf

(注:ls -al 看文件详细信息)

代码如下

——————————————————————

[root@sanchuang-linux chenpeng]# find . -name “*.sh” |xargs ls -al
-rw-r–r–. 1 root root 77 10 月 16 15:30 ./redirect/abc.sh
-rw-r–r–. 1 root root 206 10 月 16 15:45 ./redirect/student_information.sh
-rw-r–r–. 1 root root 300 10 月 16 17:15 ./test.sh
[root@sanchuang-linux chenpeng]# ls -al test.sh
-rw-r–r–. 1 root root 300 10 月 16 17:15 test.sh


正文完
 0