马哥M28-第一天、


1.前瞻介绍:1970~unics -> unix  C :unix出现,第一台计算机出现;1972年10台;1984年richard stallman创建GNU组织(gnu is not linux),制定了GPL守则 ->可以使用其对unix进行修改、复制粘贴等一系列编辑开发,最终发布后也必须公布自己的源代码!


2.linux系统安装-CentOS6.9 \7.4:

  a.使用VMware workstation;

  b.磁盘分区:/   /boot   /app  /swap(swap是一种文件系统类型) :一块磁盘分四个区;linux系统下一切皆文件,所以使用前必须进行挂载 mount!

    fdisk -l 查看磁盘分区情况(fdisk /dev/* 进行分区)  --> /dev/sda、sdb等命名是磁盘,/dev/sda->sda1、sda2、sda3...分区;

    mount /dev/sda1 / ;  mount /dev/sda2  /boot ...; df -lh ->查看分区挂载情况

  c.安装过程中遇到较难排查问题:因为镜像文件的缺失不全等,导致安装过程报错(please insert CentOS disc)

  d.安装完成后,需要进行快照拍照:虚拟机->快照->快照拍摄


3.装机时网络连接模式:桥接模式、NAT模式、仅主机模式:

  a.桥接模式:VMware桥接模式,也就是将虚拟机的虚拟网络适配器与主机的物理网络适配器进行交接,虚拟机中的虚拟网络适配器可通过主机中的物理网络适配器直接访问到外部网络(例如图中所示的局域网和Internet,下同)。简而言之,这就好像在上图所示的局域网中添加了一台新的、独立的计算机一样。因此,虚拟机也会占用局域网中的一个IP地址,并且可以和其他终端进行相互访问。桥接模式网络连接支持有线和无线主机网络适配器。如果你想把虚拟机当做一台完全独立的计算机看待,并且允许它和其他终端一样的进行网络通信,那么桥接模式通常是虚拟机访问网络的最简单途径。

   b.NAT模式(network-address-translation):NAT模式也是VMware创建虚拟机的默认网络连接模式。使用NAT模式网络连接时,VMware会在主机上建立单独的专用网络,用以在主机和虚拟机之间相互通信。虚拟机向外部网络发送的请求数据"包裹",都会交由NAT网络适配器加上"特殊标记"并以主机的名义转发出去,外部网络返回的响应数据"包裹",也是先由主机接收,然后交由NAT网络适配器根据"特殊标记"进行识别并转发给对应的虚拟机,因此,虚拟机在外部网络中不必具有自己的IP地址。从外部网络来看,虚拟机和主机在共享一个IP地址,默认情况下,外部网络终端也无法访问到虚拟机。在一台主机上只允许有一个NAT模式的虚拟网络。因此,同一台主机上的多个采用NAT模式网络连接的虚拟机也是可以相互访问的。默认情况下,外部网络无法访问到虚拟机,不过我们也可以通过手动修改NAT设置实现端口转发功能,将外部网络发送到主机指定端口的数据转发到指定的虚拟机上。比如,我们在虚拟机的80端口上"建立"了一个站点,只要我们设置端口转发,将主机58端口上的数据转发给虚拟机的80端口,就可以让外部网络通过主机的58端口访问到虚拟机80端口上的站点。

   c.仅主机模式:是一种比NAT模式更加封闭的的网络连接模式,它将创建完全包含在主机中的专用网络。仅主机模式的虚拟网络适配器仅对主机可见,并在虚拟机和主机系统之间提供网络连接。相对于NAT模式而言,仅主机模式不具备NAT功能,因此在默认情况下,使用仅主机模式网络连接的虚拟机无法连接到Internet(在主机上安装合适的路由或代理软件,或者在Windows系统的主机上使用Internet连接共享功能,仍然可以让虚拟机连接到Internet或其他网络)。在同一台主机上可以创建多个仅主机模式的虚拟网络,如果多个虚拟机处于同一个仅主机模式网络中,那么它们之间是可以相互通信的;如果它们处于不同的仅主机模式网络,则默认情况下无法进行相互通信(可通过在它们之间设置路由器来实现相互通信)。



马哥M28-第二天、


1.tty:显示当前终端的终端名->母终端图形登入界面终端tty1,字符界面终端tty2 ,ctrl+alt+F2切换到字符界面,alt+F1切回到图形界面;使用terminal开始的其他终端可叫做伪终端也是子终端pts/0..n

2.shell --人机交互的语言,将界面输入的指令交给内核去执行,从而交互硬件(shell,一种命令解释器);

  $SHELL :显示当前登录的shell版本(bash,sh,ksh,csh,zsh,nologin[不登陆shell,不需要交互-->数据库服务等通常只需用户名启动服务,但是不登陆])

3.who ,whoami(who am i),w;

id 显示当前用户信息(包含用户名、uid、组名、gid)

pwd显示当前所在目录的绝对路径。

[root@centos6 ~]#

[用户名@主机名前缀 目录路径后缀]#|$  (root是为#,普通用户时为$)

echo $PS1显示当前的提示符格式

PS1="\[\e[31m\][\u@\h \W]\\$\[\e[0m\] " 


      **积累总结:''和"" :单引号可以将特殊字符原样表示(自带转义)

        例如:PS1="\[\e[32m\][\u@\h \W]\\$\[\e[0m\] " 

      **    ==PS1='[\e[32m][\u@\h \W]\$[\e[0m] ' --> 重点说明:将\e[31m (或者\033[31m即开启转义序列功能部分)和 \e[0m (或者 \033[0m 关闭转义序列属性)必须放到 []内,才能防止失误显示等问题 


4.

内部命令与外部命令(type command 显示命令的类型)

enable

enable 显示所有已激活的内部命令

enable command 激活被禁用的内部命令

enable |wc -l 显示激活中的内部命令的数量

enable -a 显示所有的内部命令

enable -a |wc -l 显示所有的内部命令的数量

enable -n 显示所有被禁用的内部命令

enable -n command 禁用某个内部命令


             hash

                    hash 显示所有被hash的命令路径

                    hash -l 显示所有被hash的命令路径,包含别名

                    hash -d 别名 -> 删除指定别名的hash条目  

                    hash -r  清空所有的hash

                    hash -t 别名  -> 显示别名的hash路径

                    hash -p 路径  别名  ->手动增加一条hash


             

help 内部命令  查看内部命令的帮助信息


当执行一条命令时的查找顺序

别名

内部命令

外部命令

hash

PATH

alias

alias 显示所有的别名信息

alias 别名='command -选项 参数'

unalias 别名

unalias -a 取消所有别名

别名的保存 nano /etc/bashrc

使命令不受别名影响的方式    cp、rm :禁用之后不交互了!!

\command

'command'

"command"

/path/command


5.date

+%Y 年

+%m 月

+%d 日

+%H 时

+%M 分

+%S 秒

+%w 星期

+%F 年-月-日

+%T 时:分:秒


 设置时间

 date 102013112020.45  月日时分年[.秒]

 date -s '年-月-日 时:分:秒'

 小总结1:date命令显示时间中周末时间是阿拉伯数字,如果想要显示成汉字表示的就要考虑使用多分支情况流程控制:

        [...] case week in A:

               1) week = "一";;

               2) week = "二";; 

               3)...

               *) default ;;

              echo $week 

               ...


 时区修改

 Centos6: 

 ln -f /usr/share/zoneinfo/America/New_York /etc/localtime

 ln -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 


 Centos7:

 ln -f -s /usr/share/zoneinfo/America/New_York /etc/localtime 

 ln -f -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 

    hwclock行同于clock

    clock -s 将软时间写入硬时间  关机时自动进行

    clock -w 将硬时间写入软时间  开机时自动进行


    poweroff关机

    reboot重启

    init 0 关机

    init 6 重启

    shutdown -r 重启

    shutdown -h 关机

    shutdown +1

    shutdown 20:00

    shutdown -c 取消计划关机



6.个人实测

**who 显示所有终端的信息 :注意同ls,ls本意显示的是一竖排,who本意显示的是一整行(不同登录信息记录之间用空格隔开) ,所以 ls -1 会在终端上竖排显示, 而who会以竖排的方式在终端上显示,实际保存信息到其他文件后会以整行信息显示!!

w 显示所有终端的详细信息及所做的操作


7.screen 

screen 生成默认命令方式的screen即终端名.主机名前缀

screen -S 会话名 创建指定名的screen

screen -x 会话名 加入已创建的screen

screen -ls 查看所有已打开的Screen


echo 

-E 不开启解释功能,默认

-n 不自动换行

-e 开启解释功能 ""    :echo 开启解释功能后所有的选项必须要包含在 "双引号"中!!

\a 警告声

\b 退格

\c 不换行

\n 回车换行

\r 回车,即光标移至行首,但不换行

\t 插入tab

\\ 插入\

    特殊符号使用:

       $() 或 ``引用命令执行的结果

       $(()) 或$[]进行运算

       使用${}或"$变量名" 划定变量名的起止范围, {1..100}输出1到100用空格分隔 ;{1,} 1到无穷大 {n,m}包含n到m以及之间的字符集合;{1,2}{a,b}->排列组合;


8.history

history 查询历史记录

!n  重复执行某条历史

!!  重复执行上一条命令

ctrl+p 等于上箭头

ctrl+n 等于下箭头

ctrl+j 等于回车

!string  重复前一个以“string”开头的命令

!?string 

ctrl+r 命令历史中搜索命令


history -c 清空当前的所有历史记录

history -d 删除某条历史

history -a 将当前终端新执行的命令写入历史记录文件   (文件由变量HISTFILE决定,默认为用户家目录下的.bash_history

history -w /path/filename.txt 将历史记录写入指定文件

history -n 将未读过的历史从文件中读取

history -r 将所有的历史从文件中读取\(重复一倍)

     

       内置变量: HISTCONTROL


               :1.export HISTCONTROL=ignoredups (设置消除连续重复的历史记录)

               :2.export HISTCONTROL=erasedups (清除所有命令历史记录中的重复历史)

               :3.export HISTCONTROL=ignorespace (忽略掉以空格开头的命令记录,即初级命令记录隐藏不记录)

               :4.unset HISTFILE(set HISTSIZE=0);

               :5.ln -s /dev/null ~/.bash_history

               :6.修改 /etc/profile 文件中的 HISTSIZE=1000 ,将1000改为0

               :7.

        if [grep "unset HISTFILE" /etc/profile >/dev/null 2>&1];then

            find / -iname '*.bash_history' -type f -exec rm -f {} \;

        else

            echo "unset HISTFILE" >> /etc/profile

            find / -iname '*.bash_history' -type f -exec rm -f {} \;

        fi


         (系统日志:登录系统会产生,需要关注所有可能发生变化的日志;; 

          思考:当******系统并通过事先修改一系列文件等操作不留任何记录时,如何尽早发现!!)



马哥M28-第三天、



history显示当前终端的历史记录

!! 重复执行上一条命令

!-n 重复执行倒数第n条命令

!n 重复执行第n条命令

ctrl+p 等于向上方向键,翻出上一条命令。

ctrl+n 等于向下方向键,翻出下一条命令。

ctrl+j 等于enter 执行当前命令

!:0 执行前一条命令(去除参数)

!string 重复前一个以“string”开头的命令

!?string 重复前一个包含string的命令

!string:p 仅打印以string开头的命令历史,而不执行

!$:p 打印输出 !$ (上一条命令的最后一个参数)的内容

!*:p 打印输出 !*(上一条命令的所有参数)的内容

^string 删除上一条命令中的第一个string

^string1^string2 将上一条命令中的第一个string1替换为string2

!:gs/string1/string2 将上一条命令中所有的string1都替换为string2

ctrl-r来在命令历史中搜索命令

(reverse-i-search)`’:

Ctrl+g:从历史搜索模式退出

要重新调用前一个命令中最后一个参数:

!$表示

Esc, .(点击Esc键后松开,然后点击 . 键)

Alt+ .(按住Alt键的同时点击 . 键) 


command !^ : 利用上一个命令的第一个参数做cmd的参数

command !$ : 利用上一个命令的最后一个参数做cmd的参数

command !* : 利用上一个命令的全部参数做cmd的参数

command !:n : 利用上一个命令的第n个参数做cmd的参数

command !n:^ 调用第n条命令的第一个参数

command !n:$ 调用第n条命令的最后一个参数

command !n:m 调用第n条命令的第m个参数

command !n:* 调用第n条命令的所有参数

command !string:^ 从命令历史中搜索以 string 开头的命令,并获取


它的第一个参数

command !string:$ 从命令历史中搜索以 string 开头的命令,并获取它


的最后一个参数

command !string:n 从命令历史中搜索以 string 开头的命令,并获取


它的第n个参数

command !string:* 从命令历史中搜索以 string 开头的命令,并获取


它的所有参数



bash快捷键

Ctrl+L 清屏

Ctrl+O 执行当前命令,并重新显示本命令

Ctrl+s 锁定,但仍可以运行命令。

Ctrl+q 解锁

Ctrl+C 强制结束

Ctrl+D 正常终止

Ctrl+Z 挂起(暂停)命令 

**:Ctrl+Z 挂起(暂停)命令 -->配合jobs查看当前终端所挂起的进程


信息,

            恢复使用fg --> fg +jobnumber,恢复指定进程任务后可以ctrl+c结


束任务,

            bg-->将进程任务以后台的方式进行运行,在终端上不显示!

        Ctrl + a 光标移到命令行首,相当于Home

Ctrl + e 光标移到命令行尾,相当于End 

Ctrl + f 光标向右移动一个字符

Ctrl + b 光标向左移动一个字符 

Alt + f 向右移动一个单词

Alt + b 向左移动一个单词

Ctrl + xx 光标在命令行首和光标之间移动

Ctrl + u 删除光标之前的内容

Ctrl + k 删除光标这后的内容

Alt + r 清除全部内容

Ctrl + w 从光标处向左删除至单词首 

Alt + d 从光标处向右删除至单词尾

Ctrl + d 删除光标后的一个字符

Ctrl + h 删除光标前的一个字符

Ctrl + y 将删除的字符粘贴至光标后

Alt + c 从光标处开始向右更改为首字母大写的单词

Alt + u 从光标处开始,将右边一个单词更改为大写 

Alt + l 从光标处开始,将右边一个单词更改为小写 

Ctrl + t 交换光标处和之前的字符位置

Alt + t 交换光标处和之前的单词位置

Alt + N 提示输入指定字符后,重复显示该字符N次(N表示具体的数字


Ctrl-Shift-n 创建新窗口 

Ctrl-Shift-q 关闭当前窗口

Ctrl-Shift-t 创建一个标签页

Ctrl-Shift-w 关闭一个标签页

Ctrl-PaUp/PgUn 切换到下一个/前一个标签页

Ctrl-Shift-c 复制选中的文本

Ctrl-Shift-v 把文本粘帖到当前光标处

Whatis

whatis command 或 man -f command

仅能提供命令基本的介绍。不提具体用法。

基于数据库的查找

优点:检索速度快

缺点:缺乏实时性

CentOS6

/var/cache/man/whatis

makewhatis

CentOS7 

/var/cache/man/index.db

mandb


        (Unix Like 类unix系统)


        pwd

pwd -P 当前目录为软链接时,显示其源目录

        基名:basename

        目录名:dirname



1.ls用法 

ls -a 显示所有文件

ls -A 显示所有文件,除.、..

ls -l 长列出

-rw-r--r--. 1 root root 2193 Jul 14 17:28 passwd

文件类型|owner权限group权限other权限|硬链接数|owner|


group|文件大小(bytes)|mtime|文件名

ls -R 递归

ls -ld 显示指定目录的详细信息。

ls -1 竖显示

ls -S 按文件大小降序排列

ls -t 按修改时间(mtime)从新到旧排列

ls -ut 按访问时间(atime) 从新到旧排列

ls -U 按文件存放的先后顺序

ls -X 按文件后缀排序

ls -i 显示inode号



时间戳

atime 访问时间

mtime 文件数据修改时间

ctime 文件元数据修改时间

stat filename:查看文件状态


touch filename 当文件不存在时,则创建一个空文件,名为filename

  当文件已存在时,则更新期时间戳

  -a 仅更新atime,ctime

  -m 仅更新mtime, ctime 

  touch filename 更新全部时间戳。



ls -a --ignore=[^.]*   -->" ^ "托字符在[]外表示以什么开头,在[]内表示非即除什么以外

ls -a -I "[^.]*"

ls -d .*


****通配符提升补充****


    1.数字范围表示: [0-9] --> [[:digit:]]; 

    2.所有英文字母范围:  [a-Z](aAbBcC...zZ) --> [[:alpha:]]

    3.小写英文字母范围:[[:lower:]]

    4.大写英文字母范围:[[:upper:]]

    **5.空格和换行符集合范围:[[:space:]] 包含 "空格和换行符\n" -->表示空白符(空格和垂直制表符)

    6.符号范围表示:[[:punct:]]

    7.所有字母和数字范围表示:[[:alnum:]]

    8.单独表示空格的特殊范围表示法--水平空白制表符:[[:blank:]]    [:blank:]

作业:

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

      ls -d /etc/k*[[:digit:]]*[[:lower]]

   2、显示/proc目录下名字由任意三位数字组成的文件或目录

      ls -d /proc/[0-9][0-9][0-9]

   3、显示/var/log目录下文件名包含符号及数字的文件或目录

      ls -d /var/log/*[[:punct:]]*[0-9]*

   4、显示/usr/share/man目录下所有以m开头,以一个数字和x结尾的文件或目录

      ls -d /usr/share/man/m*[0-9]x

   5、显示/etc目录下,所有以一个大写字母开头,以两个数字结尾的文件或目录

      ls -d /etc/[[:upper]]*[0-9][0-9]

   6、显示/etc目录下,文件名至少包含一个小写字母和一个数字并以.conf结尾的文件或目录

      ls -d /etc/*[[:lower]]*[0-9]*.conf

   7、只显示用户家目录下的非隐藏目录

      ls -d ~/*/




马哥M28-第四天、


一、

1.cp

   -i:覆盖前提示 –n:不覆盖,注意两者顺序

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

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

   -d:--no-dereference --preserv=links 不复制原文件,只复制链接名

   --preserv[=ATTR_LIST]

mode: 权限

ownership: 属主属组 == owner

timestamp: == time

links

xattr

context

all

-p: 等同--preserv=mode,ownership,timestamp

-v: --verbose  显示复制的过程

     **-f: --force  当普通用户对某目录有rx权限时,使用-f可以将没有修改权限的文件强制覆盖。即删除再创建    

     **-n:不覆盖复制,-->当源目录复制到目的目录,文件太多不知道哪些覆盖哪些不覆盖,直接 -n ,一次全部都不覆盖

     ** 总结1.配合du -sh 可以在复制较大数据文件时,间接性的查看复制进度(du -sh srcfile;  du -sh destfile) 


    练习:

           1、定义别名命令baketc,每天将/etc/目录下所有文件,备份到/testdir独立的子目录下,并要求子目录格式为 backupYYYY-mm-dd,备份过程可见

                   alias baketc='mkdir -p /testdir/backup$(date +%F);cp -av /etc/* /testdir/backup$(date +%F)'

           2、创建/testdir/rootdir目录,并复制/root下所有文件到该目录内,要求保留原有权限 


   


2.mv  :磁盘有磁片、磁片有磁面、磁道(从外向内0..n),位于相同磁道上的数据访问


      速度快;同分区下移动文件系统速度快:因为只是删除原inode等信息条目并新增了一


      条条目,数据块没有发生任何复制;跨分区移动实质也是复制,但是将inode信息条目


      在不同分区重新创建指向,并且数据块数据也发生复制动作!

-i:覆盖前提示

-f: 强制覆盖


3.rm  -i 删除前提示 (\rm  /bin/rm  'rm'  rm -rf)->禁用别名作用,删除时不提示

-f 强制删除

-r 删除目录

     :-->bitmap(位图): 当硬链接数减到0后,位图bitmap会将inode和block标记为空闲,只有数据被实质覆盖后才发生变化真正释放!!



4.rename(批量处理) .doc .txt  *.txt  ;   

      rename必须是三个参数:被重命名string   重命名后string   被批量重命名的文件  

      (补充:Linux中文件系统的后缀名并没有实质表示作用,但某些命令和工具会根据后缀名进行颜色表示等)


二、

索引节点、

inode(index node) 表中包含文件系统所有文件列表;

一个节点 (索引节点)是一个表项,包含一个文件的元数据信息,包括:

       文件类型,权限,UID,GID;

       链接数(指向这个文件名路径的名称个数);

       该文件的大小和不同的时间戳;

       指向磁盘上文件的数据块指针;


    有关文件的其他数据


inode表结构:

M28-sunblog-1_4_inode.png

说明:文件引用一个是inode号;人是通过文件名来引用一个文件;

      一个目录是目录下的文件名和文件inode号之间的映射 


inode方式:

M28-sunblog-1_4_inode.png


cp和inode:

    分配一个空闲的inode号,在inode表中生成新条目,在目录中创建一个目录项,将名称与Inode编号关联,拷贝数据生成新的文件

rm和inode:

     链接数递减,从而释放的inode号可以被重用;当链接数为0时,bitmap把数据块放在空闲列表中,

     删除目录项;

     数据实际上不会马上被删除,但当另一个文件使用数据块时将会被覆盖

mv和inode:

     如果mv命令的目标和源在相同的文件系统,作为mv命令用新的文件名创建对应新的目录项;删除旧的目录条目对应的旧的文件名;

     不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!

  如果目标和源在一个不同的文件系统,mv相当于cp 和 rm


三、

硬链接

  a.创建硬链接会增加额外的记录项以引用文件;

  b.对应于同一文件系统上一个物理文件;

  c.每个目录引用相同的inode号

  d.创建时链接数递增

  e.!! 不能跨越驱动器或分区

符号链接(软链接)

   ln -s src  dest  (只记录被引用文件或目录的路径,所以可以夸分区),不增加或减少目标文件或目录的inode的引用计数




5.tree 

-d 只显示目录

-L n 只列出指定层级的目录 

-P 通配符  只列出匹配到的文件和所有目录


mkdir 

-p 一次性创建多级目录

-v 创建目录时显示详细信息

-m 创建目录时直接设置权限


rmdir 仅删除空目录 

-p 一次性删除多级空目录   

-v 显示删除的详细信息


mkdir -p {a,b/{x,y}}


(1) 如何创建/testdir/dir1/x, /testdir/dir1/y, /testdir/dir1/x/a, 

        /testdir/dir1/x/b, /testdir/dir1/y/a, /testdir/dir1/y/b

(2) 如何创建/testdir/dir2/x, /testdir/dir2/y,/testdir/dir2/x/a, 

        /testdir/dir2/x/b

(3) 如何创建/testdir/dir3, /testdir/dir4, /testdir/dir5, /testdir/dir5/dir6, 

        /testdir/dir5/dir7



****

个人知识积累总结:

*****重点问题1:如果给用户授权访问指定目录下的所有文件和文件夹,但是不更改文件夹的所属用户和组,原文件夹所属root

    

      setfacl 参数(开启访问控制列表)

  -m:设置后续acl参数 

  -x:删除后续acl参数  

  -b:删除全部的acl参数

  -k:删除默认的acl参数

  -R:递归设置acl,包括子目录

  -d:设置默认acl





6.硬链接与软链接


ln  filename  linkname

不能跨分区(不同分区可能会有inode号重复,跨分区产生不同数据但是指向相同inode号,实际没有任何关系,所以不能跨分区)


ln -s filename linkname

可以跨分区,源被删除,链接也不可用

        重点:创建软连接时,必须是以最终使用目录作为参照物,不能随意以当前目录做参照,所以先进入到最终存放软连接的目录中,在进行软连接创建! 绝大数情况使用相对路径软连接,方便1对多,修改源即可,方便迁移(因不记录上一级目录);尽量不随意创建软连接,实践发现会占用过多inode



7.file

查看文件的类型

-b 查看时不显示文件名

-f /path/filename  文件中每个文件路径一行。从而可批量查看多个文件的类型

-F符号   按指定符号做为分隔符输出 默认是:

-L 当查询的对象为软链接时,显示源文件的类型


8.输入输出重定向


> 正确输出

        < 正确重定向输入(读取-通常读文件)

2> 错误输出

&> 全部输出

文件不存在时,>和>> 都能创建新文件,文件已存在时 >表示覆盖,>>表示追加

    2>&1 把错误的结果转成正确的结果;

    1>&2 把正确的结果转成错误的结果;

         管道 :本身只传递输出正确的结果集,所以在实际应用时可以将错误结果集转义序列为正确重定向

    2>&1  |  或 |&  将所有的结果传递给管道处理

    > 文件内容被覆盖

       a. set -C:在使用">"前先执行,可以禁止将内容覆盖已有文件,但可以追加

       b. >| filename :强制覆盖;

       c. set +C :允许覆盖

    1.合并标准输出和错误输出为同一个数据流:

       a. &> 覆盖重定向;

       b. &>> 追加重定向;

    2.() :合并多个程序的stdout:

          (cal 2007; cal 2008) >> all.txt


9.tr :重点

tr:转换和删除字符(针对处理字符集字符串string)

    tr [option]... set1 [set2] -->注意:替换的是所有属于set1字符集的元素,不一定非要是原样连续性表达的set1(所属set1集合的所有单个字符)

     **-c -C --complement:取字符集的补集,***   tr -c :除什么以外的替换 -->经常配合 "-d"使用  tr -cd ,除什么以外其他都删除(只保留控制项的集合)!!

  ***tr : -d -->会将换行符删除,所以输出结果不会换行,注意是否需要添加换行符!!

  **  tr配合tee :将数据分流,一份原样可以保存到指定文件(文件不存在即自动创建),一份以管道符传递给tr进行处理显示到终端 :echo "string" |tee test.txt |tr a-z A-Z    --1.复杂管道的故障排除; 2.同时查看和记录输出; 3.保存不同阶段的输出

 选项:

    -c -C --complement :取字符集的补集

    -d  --delete :删除所有属于第一字符集的字符

    -s  --squeeze-repeats:把连续重复的字符以单独的字符表示

    -t  --truncate-set1: 将第一个字符集对应字符转化为第二字符集对应字符


cat > file 

  ...

  ...

按ctrl +d 离开,可以使用文件来代替键盘的输入(重定向输入读取)


less: 一页一页的查看  ls -l /etc |less 

mail : mail -s "标题" 接收用户

       content...

       . (表示邮件内容结束)  返回 EOT

    选项:

      mail 直接查看

      进入之后,&n表示要查看的第n封邮件,&q表示不保存删除离开;   /var/spool/mail/*

lpr :将输入发送给打印机

     echo "content" |lpr -P print_name


tar:归档打包

tar -cvf - /home | tar -xvf - :将/home里面的文件打包,但打包的数据不是记录到文件,而是传送到stdout;经过管道后将tar -cvf - /home传送给后面的tar -xvf -。后面的这个-则是去用前一个命令的stdout,因此我们就不需要使用文件了;

其中这个|也就是管道的作用是将第一个命令的结果传输给后面的一个命令,相当于有人通过快递给你寄东西,而管道就是快递员,而-的意思是这样的,要是你不加这个-,默认是保存到硬盘的当前位置的,而用了-就是将本来要保存的文件输出到了stdout,stdout这个是标准输出,就是我们屏幕,再具体一点就是数据最终会现在那个你打命令的终端窗口。



练习:

   1、将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中

   cat /etc/issue |tr a-z A-Z > /tmp/issue.out

   tr a-z A-z < /etc/issue > /tmp/issue.outs

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

who | tr [a-z] [A-Z] > /tmp/who.out

  3、一个linux用户给root发邮件,要求邮件标题为”help”,邮件正文如下:

Hello, I am 用户名,The system version is here,please help me to 

check it ,thanks

操作系统版本信息

echo -e Hello,I am `whoami`,The system version is here,Please help me to check 


it,Thanks."\n"`cat /etc/redhat-release` | mail -s help root

  4、将/root/下文件列表,显示成一行,并文件名之间用空格隔开

ls -1 /root/ |tr "\n" " "

  5、计算1+2+3+..+99+100的总和    echo 1+2 |bc     echo {1..100}

echo {1..100} |tr " " + |bc

  6、处理字符串“xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4”,只保留其中的数字

和空格

echo "xt.,l 1 jr#hat-releasemn 2 c*/fe 3 uz 4" | tr -cd [:digit:][:blank:]

  7、将PATH变量每个目录显示在独立的一行

echo $PATH |tr : "\n"