Linux学习笔记:BASH(第十章)

1. BASH详解 

1.1 壳程序

能够操作应用程序的软件都可以被称为壳程序;狭义的壳程序指的是命令行方面的软件,包括接下来要介绍的BASH等;

shell详解:Shell是什么?1分钟理解Shell的概念! (biancheng.net)

/etc/shells文件下,可以查看可用的shells

/bin/bash是Linux默认的shell;

1.2  Bash shell功能

  • 记录历史命令
  • 命令与文件补全功能
  • 命令别名设置功能:如alias lm='ls -al'  此时,lm会等于ls -al这样一个功能;
  • 任务管理、前台、后台控制
  • 程序化脚本
  • 通配符:如ls -l /usr/bin/X* 可以用来查看/usr/bin下面有多少以X为开头的文件;

 1.3 Bash shell内置命令查询:type

[root@localhost ~]# type [-tpa] name
#选项与参数:
#不加参数:type会显示出name是外部命令还是内部命令
#-t	判断给定参数的命令类型。若输出 file、alias、builtin 则分别表示 外部命令、命令别名、内置命令。
#-p	如果给出的参数是外部命令,则显示其绝对路径。
#-a	显示所有可能的类型,包括别名、内置命令、函数等。
#-f	只返回shell函数的信息。

例子: 

[root@localhost ~]# type ls   #查寻ls这个命令是否为bash内置
ls 是 `ls --color=auto' 的别名
[root@localhost ~]# type -t ls
alias
[root@localhost ~]# type -a ls
ls 是 `ls --color=auto' 的别名
ls 是 /bin/ls
ls 是 /usr/bin/ls    //type可以找出执行文件所在的位置,如ls在/bin/ls这个目录中
[root@localhost ~]# type cd
cd 是 shell 内嵌

1.4 命令的执行与快速编辑按钮

当命令过长时,可以通过反斜杠\让命令好在下一行继续输入;

[root@localhost ~]# cp /var/spool/mail/root /etc/crontab \
>  /etc/fastb /root

命令快速删除方法

组合键功能与示范
Ctrl+u/Ctrl+k分别从光标处向前删除命令串(Ctrl+u)及向后删除命令串(Ctrl+k)
Ctrl+a/Ctrl+e分别让光标移动到整个命令串最前面(Ctrl+a)或最后面(Ctrl+e)

2 shell的变量与功能

变量就是一组文字或符号等,来替换一些设置或一串保留的数据。

2.1 变量的使用与设置:echo、变量设置规则、unset

变量的使用:echo

[root@localhost ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:                                                                                                         /root/bin

设置或修改某个变量的内容,使用“=

[root@localhost ~]# echo ${myname}
                                  //此时,无任何数据,因为该变量未被设置,是空的
[root@localhost ~]# myname=MCB    //将其设置为MCB
[root@localhost ~]# echo ${myname}
MCB                               //出现了,因为这个变量已经被设置了
[root@localhost ~]# unset myname  //取消myname的设置

2.2 变量设置规则

https://www.cnblogs.com/JiaoTou/p/10419275.htmlhttps://www.cnblogs.com/JiaoTou/p/10419275.html

变量的设置当中,单引号与双引号的用途有什么不同?

单引号与双引号最大的不同在于双引号仍可以保有变量的内容,但单引号内仅能是一般字符,而不会有特殊符号; 

假设定义一个变量,name=mcb,现在想以name这个变量的内容定义出myname显示mcb its me这个内容,如何制定? 

[root@localhost ~]# name=mcb
[root@localhost ~]# echo ${name}
mcb
[root@localhost ~]# myname="$name its me"
[root@localhost ~]# echo ${myname}
mcb its me
[root@localhost ~]# myname='$name its me'
[root@localhost ~]# echo ${myname}
$name its me

如何对一个需要经常访问的名为【/cluster/server/work/jiangsu_2023/006】工作目录进行简化?

[root@localhost ~]# work="/cluster/server/work/jiangsu_2023/006"
[root@localhost ~]# cd ${work}  //此时,就相当于进入/cluster/server/work/jiangsu_2023/006目录

什么是子进程?

在目前这个shell的这个情况下,去启用另一个新的shell,新的那个shell就是子进程;

2.3 环境变量的功能

2.3.1 利用env与export来查看目前的shell环境中有多少个默认的环境变量; 

[root@localhost ~]# env
XDG_SESSION_ID=3
HOSTNAME=localhost.localdomain
SHELL=/bin/bash            //目前这个环境下,使用的shell是哪一个程序
TERM=xterm                 //终端使用的环境是什么类型
HISTSIZE=1000              //记录命令的条数,默认为1000
QTDIR=/usr/lib64/qt-3.3
QTINC=/usr/lib64/qt-3.3/include
QT_GRAPHICSSYSTEM_CHECKED=1
USER=root                  //使用者名称
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:                //代表一些颜色的显示
MAIL=/var/spool/mail/root
PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root                   //目前使用者所代表的工作目录
LANG=zh_CN.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root                  //使用者的家目录
LOGNAME=root
QTLIB=/usr/lib64/qt-3.3/lib
XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share
LESSOPEN=||/usr/bin/lesspipe.sh %s
_=/bin/env

利用set来观察所有变量,包括环境变量与自定义变量

2.3.2 PS1:(提示符设置) 

    PS1 (数字 1 不是英文字母), 当我们每次按下 [Enter] 按键去执行某个指令后,最后要再次出现提示字符时, 就会主动去读取这个变数值了。上头 PS1 内显示的是一些特殊符号,这些特殊符号可显示不同的信息, 每个 distributions 的 bash 默认的 PS1 变量内容可能有些许的差异。 可用 man bash 去查询一下 PS1 的相关说明,以理解底下的一些符号意义。

 \d     :可显示出『星期 月 日』的日期格式,如:"Mon Feb 2"
 \H    :完整的主机名。举例来说,鸟哥的练习机为『www.vbird.tsai』
 \h    :仅取主机名在第一个小数点之前的名字,如鸟哥主机则为『www』后面省略
 \t     :显示时间,为 24 小时格式的『HH:MM:SS』
 
\T    :显示时间,为 12 小时格式的『HH:MM:SS』
 
\A    :显示时间,为 24 小时格式的『HH:MM』
 
\@  :显示时间,为 12 小时格式的『am/pm』样式
 
\u    :目前使用者的账号名称,如『root』;
 
\v    :BASH 的版本信息,如鸟哥的测试主板本为 3.2.25(1),仅取『3.2』显示
 
\w   :完整的工作目录名称,由根目录写起的目录名称。但家目录会以 ~ 取代;
 
\W  :利用 basename 凼数取得工作目录名称,所以仅会列出最后一个目录名。
 \#   :执行的第几个指令。
 
\$   :提示字符,若为 root 时,提示字符为 # ,否则就是 $ 
例题:

//将[mcb@localhost root]$改为[mcb@localhost /home/mcb 22:00 #12]$
[mcb@localhost root]$ cd /home
[mcb@localhost home]$ PS1='[\u@\h \w \A #\#]\$'
[mcb@localhost /home/mcb 22:00 #12]$

2.3.4 export: 将自定义变量转成环境变量

自定义变量与环境变量差异在于该变量是否会被子进程所继续使用

将自定义变量转换成环境变量后,可以让父进程中的变量值在子进程中继续存在;

语法:export 变量名称 

这个东西用来共享自己的变量设置给后来调用的文件或其他进程;

2.3.5 locale影响显示结果的语系变量 

[mcb@localhost ~]$ locale -a
aa_DJ
aa_DJ.iso88591
..(中间省略)....
zh_SG.gbk
zh_SG.utf8
zh_TW
zh_TW.big5
zh_TW.euctw
zh_TW.utf8
zu_ZA

2.3.4 read、array、declare 变量键盘读取、数组与声明

read:读取来自键盘输入的变量
[mcb@localhost ~]$ read [-pt] variable
选项与参数
-p: 后接提示字符
-t:后接等待的秒数

//例一:让使用者由键盘输入一内容,将该内容变成名为atest的变量
[mcb@localhost ~]$ read atest
this is a test        //此时光标会等待你的输入,请输入左侧文字查看
[mcb@localhost ~]$ echo ${atest}
this is a test

//例二:提示使用者30秒内输入你自己的大名,将该字符变为名为named的变量内容
[mcb@localhost ~]$ read -p "please input your name: " -t 30 named
please input your name: mcb
[mcb@localhost ~]$ echo ${named}
mcb        //输入的数据成为了一个变量
declare,typeset 声明变量的类型
[mcb@localhost ~]$ declare [-aixr] variable
选项与参数
-:给变量设定类型属性。
+:取消变量的类型属性。
-a:将变量声明为数组型。
-i:将变量声明为整数型(integer)。
-r:将变量声明为只读变量。注意,一旦设置为只读变量,既不能修改变量的值也不能删除变量,甚至不能通过+r取消只 读属性。
-x:将变量声明为环境变量。
-p:显示指定变量的被声明类型。

[mcb@localhost ~]$ sum=100+200+300
[mcb@localhost ~]$ echo ${sum}
100+200+300            //文字形式的变量属性,因为变量类型默认为字符串
[mcb@localhost ~]$ declare -i sum=100+200+300    //此时,将变量sum声明成int型
[mcb@localhost ~]$ echo $sum
600
[mcb@localhost ~]$ declare -x sum
[mcb@localhost ~]$ declare -p sum    //列出当前变量的类型
declare -ix sum="600"
[mcb@localhost ~]$ declare +x sum    //取消当前变量的某一个类型
[mcb@localhost ~]$ declare -p sum
declare -i sum="600"

数组(array)变量类型

数组设置方式:var[index]=content

[mcb@localhost ~]$ var[1]="small ming"
[mcb@localhost ~]$ var[2]="big boy"
[mcb@localhost ~]$ var[3]="cai bao"
[mcb@localhost ~]$ echo "${var[1]},${var[2]},${var[3]}"
small ming,big boy,cai bao

与文件系统及程序的限制关系:ulimit

ulimit:用来限制用户的某些系统资源,包括可以开启的文件数量,可以使用的CPU时间,可以使用的内存总量等;

[mcb@localhost ~]$ ulimit [-SHacdfltu] [配额]
选项与参数
S:表示警告的限制,超出设定的值会警告。
H:表示严格的限制,超出设定的值会报错。
a:列出系统所有资源限制的值
c:当某些程序发生错误时,系统可能会将该程序在内存中的信息写成文件(除错用),这种文件就被称为核心文件(core file)。此为限制每个核心文件的最大容量
d:程序可使用的最大段内存容量
f:当前shell可创建的最大文件容量
l:可以锁定的物理内存的最大值
p:管道的最大值
s:堆栈的最大值
t:每个进程可以使用CPU的最大时间
u:每个用户运行的最大进程并发数
v:当前shell可使用的最大虚拟内存

//例一:列出你目前身份的所有限制数据数值
[mcb@localhost ~]$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 3766
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 3766
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

//限制使用者仅能建立10MBytes以下容量的文件
[mcb@localhost ~]$ ulimit -f 10240
[mcb@localhost ~]$ ulimit -a | grep 'file size'
core file size          (blocks, -c) 0
file size               (blocks, -f) 10240
[mcb@localhost ~]$ dd if=/dev/zero of=123 bs=1M count=20   //尝试建立20MB的文件,结果失败了
文件大小超出限制(吐核)
[mcb@localhost ~]$ rm 123     

ulimit命令大全: 

Linux ulimit命令 | 菜鸟教程 (runoob.com)https://www.runoob.com/linux/linux-comm-ulimit.html变量内容的删除、取代与替换

① 变量内容的删除

//例一:让小写的path自定义变量与PATH内容相同
[mcb@localhost ~]$ path=${PATH}
[mcb@localhost ~]$ echo ${PATH}
/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/mcb/.local/bin:/home/mcb/bin
//将第一个目录/usr/lib64/qt-3.3/bin去掉
[mcb@localhost ~]$ echo ${path#/*/bin:}
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/mcb/.local/bin:/home/mcb/bin
//删除前面的所有目录,仅保留最后一个目录
[mcb@localhost ~]$ echo ${path##/*:}
/home/mcb/bin

 *:代表通配符

[mcb@localhost ~]$ path=${PATH}
[mcb@localhost ~]$ echo $path
/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/mcb/.local/bin:/home/mcb/bin
//删除最后一个目录,即从:到bin为止的字符
[mcb@localhost ~]$ echo ${path%:*bin}
/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/mcb/.local/bin
//只保留第一个目录
[mcb@localhost ~]$ echo ${path%%:*bin}
/usr/lib64/qt-3.3/bin

② 变量内容的替换

//将path变量内容内的sbin替换成大写SBIN
[mcb@localhost ~]$ echo ${path/sbin/SBIN}
/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/usr/local/SBIN:/usr/sbin:/home/mcb/.local/bin:/home/mcb/bin
//如果是两条斜线,那么就变成所有符合的内容都会被替换
[mcb@localhost ~]$ echo ${path//sbin/SBIN}
/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/usr/local/SBIN:/usr/SBIN:/home/mcb/.local/bin:/home/mcb/bin
变量设置方式说明
${变量#关键词}若变量内容从头开始的数据符合【关键词】,则将符合的最短数据删除
${变量##关键词}若变量内容从头开始的数据符合【关键词】,则将符合的最长数据删除
${变量%关键词}若变量内容从尾向前的数据符合【关键词】,则将符合的最短数据删除
${变量%%关键词}若变量内容从尾向前的数据符合【关键词】,则将符合的最长数据删除
${变量/旧字符串/新字符串}若变量内容符合【旧字符串】则【第一个旧字符串会被新字符串替换】
${变量//旧字符串/新字符串}若变量内容符合【旧字符串】则【全部的旧字符串会被新字符串替换】

3. 命令别名与历史命令

3.1 命令别名设置:alias、unalias(重点)

//查看目前有哪些的命令别名
[mcb@localhost ~]$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

//将ls -la |more简化成lm,然后将建立的命令别名lm删除
[mcb@localhost ~]$ alias lm='ls -la | more'
[mcb@localhost ~]$ unalias lm
[mcb@localhost ~]$ alias

3.2 历史命令 history

[mcb@localhost ~]$ history [n]
[mcb@localhost ~]$ history [-c]
[mcb@localhost ~]$ history [-raw] histfiles
选项与参数
 n: 显示历史记录中最近的n个记录;
-c:清空当前历史命令;
-a:将历史命令缓冲区中命令写入历史命令文件中;
-r:将历史命令文件中的命令读入当前历史命令缓冲区;
-w:将当前历史命令缓冲区命令写入历史命令文件中;

//列出目前最近的4条数据
[mcb@localhost ~]$ history 4
  277  alias lm='ls -la | more'
  278  unalias lm
  279  alias
  280  history 4

#默认情况下,会将历史记录写入到~/.bash_history当中

利用history查询命令后,可以利用相关的功能来帮助执行命令,如下: 

[mcb@localhost ~]$ !number    //执行第number条命令
[mcb@localhost ~]$ !!        //执行上一条命令(相当于按向上键后,回车)
[mcb@localhost ~]$ !command   //由最近的命令向前查找【命令串开头为command】的那个命令,并执行

[mcb@localhost ~]$ !88        //执行第88条命令
[mcb@localhost ~]$ !!        //执行上一个命令,即继续执行第88条命令
[mcb@localhost ~]$ !al        //执行最近以al开头的命令

4 Bash Shell的操作环境

4.1 bash的登录与欢迎信息:/etc/issue、/etc/motd

/etc/issue中可以修改终端登陆界面

issue内的各代码意义
\d 本地端时间的日期\r  操作系统的版本
\l  显示第几个终端界面\t  显示本地端时间的时间
\m  显示硬件的等级(i386/i486/i586)\S  操作系统的名称
\n  显示主机的网络名称\v  操作系统的版本
\O  显示domain name
//将登陆界面定制为:
Cent0S Linux 7 (Core) (terminal: tty2)
Date: Fri Jun 16 2023 08:52:33
Kernel 3.10.-116.el7.x86_64 on an x86_64
Welcome! Mr Ma

//进入/etc/issue,写入以下内容
\S (terminal: \l)
Date: \d \t
Kernel \r on an \m
Welcome! Mr Ma

4.2 BASH环境的配置文件(重点)

若要将命令别名,自定义的变量等。在注BASH后仍然有效,就必须将这些设置写入到配置文件才可以;

  • login shell:取得bash时需要完整地登录流程,就称为login shell;如需要输入用户的账号和密码等
  • non-login shell:取得bash的方法不需要重复登录的操作;

[root@localhost ~]# cat ~/.bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

4.3 终端环境设置:stty、set

stty用来查看目前的一些按键内容;

[root@localhost ~]# stty [-a]
选项与参数
-a:将所有的stty参数列出来

//列出所有的按键与按键内容
[root@localhost ~]# stty -a
speed 38400 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke

其中^表示【ctrl】的意思

set:用来设置整个命令输出/输入的环境

[root@localhost ~]# set [-uvCHhmBx]
选项与参数
-u:默认不启用,启用后,当使用未设置变量时,会显示错误信息
-v:默认不启用,启用后,在信息被输出前,会先显示信息的原始内容
-x:默认不启用,启用后,在命令执行前,会显示命令内容(前面有++符号)
-h:默认启用,与历史命令有关
-H:默认启用,与历史命令有关
-m:默认启用,与任务管理有关
-B:默认启用,与中括号[]的作用有关
-C: 默认不启用,若使用>等,则文件存在时,该文件不会被覆盖

//例一:显示目前所有的set设置值
[root@localhost ~]# echo $-
himBH
//设置“若使用未定义变量时,则显示错误信息”,然后取消设置。
[root@localhost ~]# set -u
[root@localhost ~]# echo $-
himuBH
[root@localhost ~]# set +u
[root@localhost ~]# echo $-
himBH

4.4 通配符与特殊符号 

符号    意义
 *    代表0 个到无穷多个任意字符
代表一定有一任意字符
[ ] 同样代表一定有一个在括号内的字符(非任意字符)。例如 abcd 代表一定有一个字符,可能是 a, b, c, d 这四个任何一个
[-]​ 若有减号在中括号内时,代表在编码顺序内的所有字符。例如 0-9 代表0到9 之间的所有数字,因为数字是连续的!
^  

若中括号内的第一个字符为指数符号(^),那表示取反,例如^abc表示除了a,b,c之外一定有一个字符

//找出/etc/下面以cron为开头的文件名
[root@localhost ~]# ll -d /etc/cron*
drwxr-xr-x. 2 root root  54 4月  24 16:21 /etc/cron.d
drwxr-xr-x. 2 root root  57 4月  24 16:21 /etc/cron.daily
-rw-------. 1 root root   0 8月   9 2019 /etc/cron.deny
drwxr-xr-x. 2 root root  22 6月  10 2014 /etc/cron.hourly
drwxr-xr-x. 2 root root   6 6月  10 2014 /etc/cron.monthly
-rw-r--r--. 1 root root 451 6月  10 2014 /etc/crontab
drwxr-xr-x. 2 root root   6 6月  10 2014 /etc/cron.weekly
//找出/etc/下面文件名【刚好是五个字母】的文件名
[root@localhost ~]# ll -d /etc/?????
drwxr-x---. 3 root root   83 4月  24 16:28 /etc/audit
drwxr-xr-x. 4 root root   71 4月  24 16:21 /etc/avahi
drwxr-xr-x. 4 root root   31 4月  24 16:19 /etc/dconf
drwxr-xr-x. 3 root root   38 4月  24 16:18 /etc/fonts
-rw-r--r--. 1 root root  501 4月  24 16:16 /etc/fstab
drwxr-xr-x. 3 root root   59 4月  24 16:20 /etc/fwupd
drwxr-xr-x. 7 root root  107 4月  24 16:19 /etc/gconf
.....下面省略...

5 数据流重定向

将某个命令执行后应该要出现在屏幕上的数据,给他传输到其他地方,例如文件或是设备(例如打印机之类)。

5.1 stdin/stdout/stderr 

  • 标准输入(stdin):代码为0,使用<或<<
  • 标准输出(stdout):代码为1,使用>或>>,利用>会将原文件中内容覆盖,若不想删除旧数据,使用>>即可;
  • 标准错误输出(stderr):代码为2,使用2>或2>>,与stdout具有相同特性
//将根目录中内容由原来的输出到屏幕上重定向成输出到~/rootfile中
[mcb@localhost ~]$ ll / > ~/rootfile
//将stdout与stderr分别存到不同的文件中
[mcb@localhost ~]$ find /home -name .bashrc > list_right 2> list_error

/dev/null 垃圾桶黑洞设备与特殊写法

//将错误的信息丢弃,屏幕上显示正确的数据
[mcb@localhost ~]$ find /home =name .bashrc 2> /dev/null
//将命令的全部数据写入到同一个文件中
[mcb@localhost ~]$ find /home =name .bashrc > list 2>&1

标准输入:stdin   <与<<   将原本需要由键盘输入的数据改由文件内容来替换

//用stdin替换键盘的输入以建立新文件的简单流程
[mcb@localhost ~]$ cat > catfile < ~/.bashrc
[mcb@localhost ~]$ ll catfile ~/.bashrc
-rw-rw-r--. 1 mcb mcb 231 6月  16 15:28 catfile
-rw-r--r--. 1 mcb mcb 231 4月   1 2020 /home/mcb/.bashrc
#注意看,这两个文件的大小是一摸一样的,几乎像是使用cp复制过来的

由于加入>在cat后面,所以这个catfile会被主动的建立;

<<:代表结束的输入字符

//当键盘输入eof时,输入结束
[mcb@localhost ~]$ cat > file <<"eof"
> hello world!
> this is a good day!
> eof
[mcb@localhost ~]$ cat file
hello world!
this is a good day!

5.2 命令执行的判断根据  ;、&&、||

如何将多命令一次性执行,而不是分开执行?此时就用到  ;、&&、||

① cmd;cmd(不考虑命令相关性的连续执行命令),即无论前一个命令执行成功与否,后一个命令都可以继续执行;

[mcb@localhost ~]$ sync;sync;shutdown -h now

$?(命令返回值)与&&或||

② 当需要考虑到前一个命令是否执行成功与后一个命令是否要执行的时候,就要用&&或||; 

此时,相邻两个命令之间具有依赖性,这个依赖性主要判断的地方在于前一个命令执行的结果是否正确;

命令执行情况说明
cmd1&&cmd21. 若cmd1执行完毕且正确执行($?=0),则开始执行cmd2
2. 若cmd1执行完毕且为错误($?≠0),则cmd2不执行
cmd1||cmd21. 若cmd1执行完毕且正确执行($?=0),则cmd2不执行
2. 若cmd1执行完毕且为错误($?≠0),则开始执行cmd2
[mcb@localhost ~]$ ls ./mcb/test && touch ./mcb/test/abc
ls: 无法访问/mcb/test: 没有那个文件或目录
[mcb@localhost ~]$ mkdir ./mcb/test
[mcb@localhost ~]$ ls ./mcb/test && touch ./mcb/test/abc
[mcb@localhost ~]$ ll ./mcb/test
总用量 0
-rw-rw-r--. 1 mcb mcb 0 6月  17 09:55 abc
//测试/mcb/test是否存在,若不存在就予以建立,若存在就不做任何事情
[mcb@localhost ~]$ ls /tmp/test || mkdir /tmp/test
ls: 无法访问/tmp/test: 没有那个文件或目录
[mcb@localhost ~]$ ll -d /tmp/test
drwxrwxr-x. 2 mcb mcb 6 6月  17 10:29 /tmp/test

6 管道命令【|

仅能处理经由前一命令传来的正确信息,也就是标准输出的信息,对于标准错误并没有直接处理的能力;

管道后面接的第一个数据必定是命令,且这个命令必须是能够接受标准输入的数据才行,如(less/more/head/tail)等,而ls,cp,mv等就不是管道命令;

6.1 选取命令:cut、grep

cut:将一行信息中取出想要的部分

[mcb@localhost ~]$ cut -d'分隔字符‘ -f fields
[mcb@localhost ~]$ cut -c 字符区间
选项与参数
-d:后面接分隔字符,与-f一起使用
-f:根据-d后面的分隔字符将一段信息划分为数段,用-f取出第几段的意思
-c:以字符的单位取出固定字符区间

[mcb@localhost ~]$ echo ${PATH}
/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/mcb/.local/bin:/home/mcb/bin
[mcb@localhost ~]$ echo ${PATH} | cut -d':' -f 3,5
/usr/bin:/usr/sbin

//将export输出的信息,取得第12个字符以后的所有字符
[mcb@localhost ~]$ export | cut -c 12-

grep:分析一行信息,若有想要的,就将该行拿出来

[mcb@localhost ~]$ grep [-acinv] [--color=auto] '查找字符' filename
选项与参数
-a:将二进制文件以文本文件的方式查找数据
-c:计算找到'查找字符'的次数
-i:忽略大小写的不同,所以大小写视为相同
-n:顺便输出行号
-v:反向选择,亦即显示出没有'查找字符'内容的那一行
--color=auto:可以将找到的关键字部分加上颜色的显示

//last命令可以用来显示登陆者的信息
//将last中有出现root的那一行就显示出来
[mcb@localhost ~]$ last | grep 'root'
root     tty2                          Wed May 10 20:08 - 23:15  (03:06)
root     tty2                          Tue May  9 13:59 - 23:02  (09:03)
root     tty2                          Mon Apr 24 23:04 - crash (2+20:24)
root     tty2                          Mon Apr 24 23:03 - 23:04  (00:00)
root     tty2                          Mon Apr 24 16:50 - 23:02  (06:12)
root     tty2                          Mon Apr 24 16:39 - 16:44  (00:05)
//在last输出信息中,只要有root就取出,并且仅取第一栏
[mcb@localhost ~]$ last | grep 'root' | cut -d ' ' -f1
root
root
root
root
root
root

6.2 排序命令:sort、wc、uniq

sort 根据不同的数据形式进行排序

[mcb@localhost ~]$ sort [-fbMnrtuk] [file or stdin]
选项与参数
-f:忽略大小写的差异
-b:忽略前面的空格字符部分
-M:以月份的名字来排序
-n:使用纯数字进行排序(默认以文字形式进行排序)
-r:使用反向排序
-u:就是uniq,相同的数据中,仅出现一行代表
-t:分隔符号,默认以tab键分隔
-k:以哪个区间来进行排序的意思

///etc/passwd内容是以:来分隔的,并以第三栏来进行排序
[mcb@localhost ~]$ cat /etc/passwd | sort -t ':' -k 3
root:x:0:0:root:/root:/bin/bash
mcb:x:1000:1000:centos7.0:/home/mcb:/bin/bash
qemu:x:107:107:qemu user:/:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

uniq:将排序完成后重复的数据仅列出一个显示

[mcb@localhost ~]$ uniq [-ic]
选项与参数:
-i:忽略大小写
-c:进行计数
//使用last将账号列出,仅列出账号栏,进行排序后仅取出一位,并统计每个账号登陆的次数
[mcb@localhost ~]$ last | cut -d ' ' -f1 | sort | uniq -c
      1
     57 mcb
     23 reboot
      6 root
      1 wtmp

wc:计算输出信息的整体数据

[mcb@localhost ~]$ wc [-lwm]
选项与参数
-l:仅列出行
-w:仅列出多少字
-m:多少字符
[mcb@localhost ~]$ cat /etc/man_db.conf | wc
    131     723    5171
//输出的三个数字分别代表:行、字数、字符数

6.3 双重定向:tee

tee  同时将数据流分送到文件与屏幕,输出到屏幕的,其实就是stdout

[mcb@localhost ~]$ tee [-a] file
-a:以累加的方式将数据加入到file中;

//将ls的数据存一份到~/homefile中,同时屏幕也有输出信息
[mcb@localhost ~]$ ls -l /home | tee -a ~/homefile | more
总用量 4
drwx------. 18 mcb mcb 4096 6月  17 21:23 mcb
[mcb@localhost ~]$ ls -l ~/homefile
-rw-rw-r--. 1 mcb mcb 59 6月  17 21:23 /home/mcb/homefile
//加上-a,可以将信息累加
[mcb@localhost ~]$ ls -l / | tee -a ~/homefile | more
总用量 28
lrwxrwxrwx.   1 root root    7 4月  24 16:17 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 5月  28 10:39 boot
drwxr-xr-x.  19 root root 3260 6月  17 09:20 dev
drwxr-xr-x. 147 root root 8192 6月  17 19:17 etc
........

此时,在~/filename中可以查看到被累加写入的数据信息 

6.4 字符转换命令:tr、col、join、paste、expand

tr 用来删除一段信息当中的文字,或进行文字信息的替换

[mcb@localhost ~]$ tr -[ds] SET1...
选项与参数:
-d:删除信息中SET1这个字符
-s:替换掉重复的字符

//将last输出中的所有小写字符替换成大写字符
[mcb@localhost ~]$ last | tr '[a-z]' '[A-Z]'
MCB      PTS/0        192.168.64.1     SUN JUN 18 08:27                                                                                 STILL LOGGED IN
MCB      :0           :0               SUN JUN 18 08:25                                                                                 STILL LOGGED IN
REBOOT   SYSTEM BOOT  3.10.0-1160.EL7. SUN JUN 18 08:23 -                                                                               08:36  (00:12)
MCB      PTS/1        192.168.64.1     SAT JUN 17 10:19 -                                                                               21:52  (11:32)
MCB      PTS/0        192.168.64.1     SAT JUN 17 09:22 -                                                                               12:20  (02:57)
......(下面省略).......

//将/etc/passwd输出的信息中,将冒号(:)删除
[mcb@localhost ~]$ cat /etc/passwd | tr -d ':'
rootx00root/root/bin/bash
binx11bin/bin/sbin/nologin

col 将【tab】转成空白键

[mcb@localhost ~]$ col [-xb]
选项与参数
-x:将tab键转换成对等的空白键

//利用cat -A显示所有的特殊案件,最后以col将[tab]键转换成空白
[mcb@localhost ~]$ cat -A /etc/man_db.conf
[mcb@localhost ~]$ cat /etc/man_db.conf | col -x |cat -A | more

使用col -x可以将cat -A中的^l(tab键)显示成空格

join 用于处理两个文件之间,有相同数据的那一行,并将其加在一起

[mcb@localhost ~]$ join [-ti12] file1 file2
参数:
-t:join默认以空格字符分隔数据,并且比对【第一栏位】的数据,如果两个文件相同,则将两个数据连成一行,且第一个栏位放在第一个
-i:忽略大小写的差异
-1:代表第一个文件要用哪个栏位来分析
-2:代表第二个文件要用哪个栏位来分析
//使用root身份将/etc/passwd与/etc/shadow相关数据整合成一栏
[root@localhost ~]# head -n 3 /etc/passwd /etc/shadow
==> /etc/passwd <==
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

==> /etc/shadow <==
root:$5$LMXvZCGx$vPjvt3RSI4IeucfARRVpGL7CoX718VEfDwLM1SjE/Y.::0:99999:7:::
bin:*:18353:0:99999:7:::
daemon:*:18353:0:99999:7:::
//将两个文件第一栏位相同者整合成一行
[root@localhost ~]# join -t ':' /etc/passwd /etc/shadow | head -n 3
root:x:0:0:root:/root:/bin/bash:$5$LMXvZCGx$vPjvt3RSI4IeucfARRVpGL7CoX718VEfDwLM1SjE/Y.::0:99999:7:::
bin:x:1:1:bin:/bin:/sbin/nologin:*:18353:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:18353:0:99999:7:::

paste: 将两行贴在一起,中间以【tab】键隔开

[root@localhost ~]# paste [-d] file1 file2
选项与参数
-d:后接可分隔字符,默认以[tab]分隔
- :若file部分写成了-,表示来自标准输入数据的意思

//用root身份,将/etc/passwd与/etc/shadow同一行贴在一起
[root@localhost ~]# paste /etc/passwd /etc/shadow
root:x:0:0:root:/root:/bin/bash root:$5$LMXvZCGx$vPjvt3RSI4IeucfARRVpGL7CoX718VEfDwLM1SjE/Y.::0:99999:7:::
bin:x:1:1:bin:/bin:/sbin/nologin        bin:*:18353:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin daemon:*:18353:0:99999:7:::
adm:x:3:4:adm:/var/adm:/sbin/nologin    adm:*:18353:0:99999:7:::

expand 将【tab】键转成空格键

[root@localhost ~]# expand [-t] file
-t:后接数字,一般一个Tab键可以用8个空格键替换,也可以自定义多少个字符替换

[root@localhost ~]# grep '^MANPATH' /etc/man_db.conf | head -n 3 | expand -t 6 - | cat -A
MANPATH_MAP /bin              /usr/share/man$
MANPATH_MAP /usr/bin          /usr/share/man$
MANPATH_MAP /sbin             /usr/share/man$
#行首的代表标志为^

6.5 划分命令

[root@localhost ~]# split [-bl] file PREFIX
选项与参数
-b: 后接欲划分成文件的大小
-l: 以行数来进行划分
PREFIX:代表前缀字符的意思,可作为划分文件的前缀文字
//将600多k的/etc/sercices,将其分为300k一个文件
[mcb@localhost ~]$ cd ./tmp; split -b 300k /etc/services services
[mcb@localhost tmp]$ ll -k services*
-rw-rw-r--. 1 mcb mcb 307200 6月  18 14:43 servicesaa
-rw-rw-r--. 1 mcb mcb 307200 6月  18 14:43 servicesab
-rw-rw-r--. 1 mcb mcb  55893 6月  18 14:43 servicesac
//将三个小文件合成一个文件
[mcb@localhost tmp]$ cat services* >> servicesback

//使用ls -la /输出的信息中,每十行记录成一个文件
[mcb@localhost tmp]$ ls -la / | split -l 10 - lsroot
[mcb@localhost tmp]$ wc -l lsroot*
  10 lsrootaa
  10 lsrootab
   2 lsrootac
  22 总用量

6.6 参数代换:xargs,后面接的是命令

将标准输入转为命令行参数

[mcb@localhost ~]$ xargs [-OepnL] command
-O: 若输入的stdin含有特殊字符,包括`、\、空格等字符时,这个-O可以将其还原成一般字符,这个参数可以用于特殊状态
-e: 这是EOF的意思,后接一个字符,当xargs分析到该字符时,停止工作
-p: 在执行每个命令时,都会询问使用者的意思
-n: 后面接次数,每次command命令执行时,要使用几个参数的意思
-L: 指定多少行作为命令行参数

#真正执行的命令紧跟在xargs后面,接受xargs传过来的参数

当xargs后面没有接任何命令时,默认以echo来进行输出

[mcb@localhost ~]$ echo "hello world" | xargs echo
hello world
//上面代码将管道左边的标准输入,转为命令行参数hello world,传给第二个echo命令

例题:将目录名a,b,c作为参数传递给xargs,然后由xargs 将标准输入转为后接命令的参数

[mcb@localhost tmp]$ mkdir a b c
[mcb@localhost tmp]$ ls
a  b  c
[mcb@localhost tmp]$ echo "a b c" | xargs rm -rf
[mcb@localhost tmp]$ ls
[mcb@localhost tmp]$
//此时,三个目录就被删除了
//默认情况下,xargs以空格作为分隔符,将标准输入分解成一个个命令行参数,如a b c
//通过命令-d可以修改分隔符
[mcb@localhost tmp]$ echo -n "asbscs" | xargs -d "s" mkdir     //-n:表示不需要添加换行符
[mcb@localhost tmp]$ ls
123.txt  a  b  c  mcb

[mcb@localhost tmp]$ echo "mcb" | xargs mkdir
[mcb@localhost tmp]$ ls
mcb
//此时,通过xargs命令又创建了一个新的目录

-p:打印出要执行的命令,询问用户是否要执行
[mcb@localhost tmp]$ echo "one two three" | xargs -p touch
touch one two three ?...y
[mcb@localhost tmp]$ ls
123.txt  a  b  c  mcb  one  three  two
-L:指定的输入多少行作为命令行参数
[mcb@localhost tmp]$ xargs -L 2
mcb
wm
mcb wm
mcb
mn
mcb mn
//每输入两行就自动输出,xargs后面默认接的是echo命令

-n: 将同一行中的n项作为一次命令传输
[mcb@localhost tmp]$ echo "a b c d e f g" | xargs -n 3 echo
a b c
d e f
g
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值