Shell命令

作者: 阿拉丁节能灯 | 来源:发表于2019-01-18 11:21 被阅读6次

bash

  bash是lunix默认使用的shell

变量的显示与设置

  • 变量的显示:echo
    变量在显示时,前面必须要加上字符""才行,或者{变量}。例如:
[root@localhost wk]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/java1.8/jdk1.8.0_121/bin:/usr/lib/java1.8/jdk1.8.0_121/jre/bin:/root/bin
[root@localhost wk]# echo ${PATH}
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/java1.8/jdk1.8.0_121/bin:/usr/lib/java1.8/jdk1.8.0_121/jre/bin:/root/bin
  • 设置变量的规则
  1. 变量与变量内容以一个等号"="来连接
  2. 等号两边不能直接接空格符
  3. 变量名只能是英文字母与数字,但是开头不能是数字
  4. 变量内容若有空格符可使用双引号“"”或单引号“'”将变量内容结合起来。但是
    -- 双引号内的特殊字符如“$”等,可以保有原本的特性
    -- 单引号内的特殊字符则仅为一般字符(纯文本)
  5. 转义字符“\”将特殊字符“$”转为一般字符
  6. 若该变量为了增加变量内容时,则可用“$变量名称”或${变量}累加内容
  7. 若改变量需要在其他字进程执行,则可用export 来使变量变成环境变量
  8. 取消变量的方法为“unset 变量名称”

[root@localhost wk]# name=xiaobaitu    //给变量赋值
[root@localhost wk]# echo $name
xiaobaitu
[root@localhost wk]# name="wo shi yizhi $name"  //出现$和空格字符用双引号
[root@localhost wk]# echo $name
wo shi yizhi xiaobaitu
[root@localhost wk]# name='bushi $name'    //出现$用单引号不管用
[root@localhost wk]# echo ${name}
bushi $name
[root@localhost wk]# unset name    //设置变量无效
[root@localhost wk]# echo $name

[root@localhost wk]# uname -r   //用发单引号表示‘先执行这里的命令,而其执行出来的结果将作为外部的’
4.19.9-1.el7.elrepo.x86_64
[root@localhost wk]# name=`uname -r`
[root@localhost wk]# echo $name
4.19.9-1.el7.elrepo.x86_64
[root@localhost wk]# 

环境变量的功能

  • env查看环境变量与常见环境变量说明
[root@localhost wk]# env
XDG_SESSION_ID=150
HOSTNAME=localhost
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=172.16.192.184 63258 22
QTDIR=/usr/lib64/qt-3.3
OLDPWD=/root
QTINC=/usr/lib64/qt-3.3/include
SSH_TTY=/dev/pts/2
QT_GRAPHICSSYSTEM_CHECKED=1
JRE_HOME=/usr/lib/java1.8/jdk1.8.0_121/jre
USER=root
CLASS_PATH=.:/usr/lib/java1.8/jdk1.8.0_121/lib/dt.jar:/usr/lib/java1.8/jdk1.8.0_121/lib/tools.jar:/usr/lib/java1.8/jdk1.8.0_121/jre/lib
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:/usr/sbin:/usr/bin:/usr/lib/java1.8/jdk1.8.0_121/bin:/usr/lib/java1.8/jdk1.8.0_121/jre/bin:/root/bin
PWD=/usr/local/wk
JAVA_HOME=/usr/lib/java1.8/jdk1.8.0_121
LANG=zh_CN.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
QTLIB=/usr/lib64/qt-3.3/lib
SSH_CONNECTION=172.16.192.184 63258 172.16.34.132 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env

  env是environment(环境)的简写,上面的例子当中,是列出了所有的环境变量。和export部分功能类似。

  • set 查看所有变量(含环境变量和自定义变量)
[root@localhost wk]# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.2.46(2)-release'
CLASS_PATH=.:/usr/lib/java1.8/jdk1.8.0_121/lib/dt.jar:/usr/lib/java1.8/jdk1.8.0_121/lib/tools.jar:/usr/lib/java1.8/jdk1.8.0_121/jre/lib
COLUMNS=270
DIRSTACK=()
EUID=0
GROUPS=()
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history
HISTFILESIZE=1000
HISTSIZE=1000
HOME=/root
HOSTNAME=localhost
HOSTTYPE=x86_64
ID=0
IFS=$' \t\n'
JAVA_HOME=/usr/lib/java1.8/jdk1.8.0_121
JRE_HOME=/usr/lib/java1.8/jdk1.8.0_121/jre
LANG=zh_CN.UTF-8
LESSOPEN='||/usr/bin/lesspipe.sh %s'
LINES=53
LOGNAME=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:'
MACHTYPE=x86_64-redhat-linux-gnu
MAIL=/var/spool/mail/root
MAILCHECK=60
OLDPWD=/root
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/java1.8/jdk1.8.0_121/bin:/usr/lib/java1.8/jdk1.8.0_121/jre/bin:/root/bin
PIPESTATUS=([0]="0")
PPID=17276
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
PWD=/usr/local/wk
QTDIR=/usr/lib64/qt-3.3
QTINC=/usr/lib64/qt-3.3/include
QTLIB=/usr/lib64/qt-3.3/lib
QT_GRAPHICSSYSTEM_CHECKED=1
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_CLIENT='172.16.192.184 63258 22'
SSH_CONNECTION='172.16.192.184 63258 172.16.34.132 22'
SSH_TTY=/dev/pts/2
TERM=xterm
UID=0
USER=root
XDG_RUNTIME_DIR=/run/user/0
XDG_SESSION_ID=150
_=/root
colors=/root/.dircolors
name=4.19.9-1.el7.elrepo.x86_64    ->刚刚定义的变量
  • export
      和env差不多,后面可跟export 变量名称。

影响显示结果的语系变量

  • locale 查看linux系统到底支持了多少的语系
[root@localhost wk]# locale -a
aa_DJ
aa_DJ.iso88591
aa_DJ.utf8
aa_ER
aa_ER@saaho
aa_ER.utf8
aa_ER.utf8@saaho
aa_ET
aa_ET.utf8

变量键盘读取、数组与声明:read、array、declar

  • read
      要读取来自键盘输入的变量。
    参数:
    -- p:后面可以接提示符
    -- t:后面可以接等待的“秒数”
[root@localhost wk]# read -p "请输入你想要叫的名字,限时30秒" -t 30 name
请输入你想要叫的名字,限时30秒xiaog^Hbaiti
[root@localhost wk]# echo $name
xiaobaiti
  • declare/typeset
      declare和typeset是一样的功能,就是声明变量的类型。
    参数:
    -- a:将后面名为variable的变量定义成为数组类型
    -- i:将后面名为variable的变量定义成为正数数字类型
    -- x:用法与export一样,就是将后面的variable变成环境变量。
    -- r:将变量设置成为readonly类型,该变量 不可被更改内容,也不能重设。
[root@localhost wk]# declare -r name
[root@localhost wk]# name=xiaobaitu
-bash: name: 只读变量
[root@localhost wk]# echo $name
xiaobaiti
[root@localhost wk]# declare -x name
[root@localhost wk]# export | grep name
declare -rx name="xiaobaiti"
[root@localhost wk]# declare +x name   ->把-变成+可以取消
[root@localhost wk]# export | grep name
[root@localhost wk]# sum=1+2+3
[root@localhost wk]# echo $sum
1+2+3
[root@localhost wk]# declare -i sum=1+2+3
[root@localhost wk]# echo $sum
6
  • 数组(array)变量类型
    -- 数组的设置方式:var[index]=content
[root@localhost wk]# var[1]=i
[root@localhost wk]# var[2]=am
[root@localhost wk]# var[3]=xiaobaitu
[root@localhost wk]# echo $var

[root@localhost wk]# echo $var[1]
[1]
[root@localhost wk]# echo ${var[2]}   ->打印数组值必须{},而且没有toString()方法
am
  • 变量内容的删除、替换与代替
[root@localhost wk]# path=$PATH
[root@localhost wk]# echo $path
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/java1.8/jdk1.8.0_121/bin:/usr/lib/java1.8/jdk1.8.0_121/jre/bin:/root/bin
[root@localhost wk]# echo ${path#/*local/bin:}
/usr/sbin:/usr/bin:/usr/lib/java1.8/jdk1.8.0_121/bin:/usr/lib/java1.8/jdk1.8.0_121/jre/bin:/root/bin
[root@localhost wk]# 
删除的表达式形式:${variable#/*local/bin:}
  • ${}:上面的特殊字体部分是关键字,用在这种删除模式是必须存在的
  • variable:这就是原本的变量名称,上面提到的path
  • # :这是重点,代表从变量内容的最前面开始向右删除,且仅删除最短的那个
  • /local/bin::代表要被删除的部分,由于#代表有前面开始删除,所以这里边有开始的/写起,徐亚注意的是,我们还可以通过通配符来替代0到无穷多个任意字符
      看下面的表达式:
[root@localhost wk]# path=$PATH
[root@localhost wk]# echo $path
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/java1.8/jdk1.8.0_121/bin:/usr/lib/java1.8/jdk1.8.0_121/jre/bin:/root/bin
[root@localhost wk]# echo ${path##/*lib/}
java1.8/jdk1.8.0_121/jre/bin:/root/bin
[root@localhost wk]# 

其中 ${path##/*lib/}有两个"#"的表哦是删除最长的那个字符。
  上面谈到的是从最前面向右删除内容,如果希望从最后面向左删除内容,可以用 %

[root@localhost wk]# echo $path
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/java1.8/jdk1.8.0_121/bin:/usr/lib/java1.8/jdk1.8.0_121/jre/bin:/root/bin
[root@localhost wk]# echo ${path%:*bin}
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/java1.8/jdk1.8.0_121/bin:/usr/lib/java1.8/jdk1.8.0_121/jre/bin
[root@localhost wk]# 

上面代码表示从后向前,删除:到bin之间的最短字符
  双"%"表示删除最长字符串

[root@localhost wk]# path=$PATH
[root@localhost wk]# echo $path
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/java1.8/jdk1.8.0_121/bin:/usr/lib/java1.8/jdk1.8.0_121/jre/bin:/root/bin
[root@localhost wk]# echo ${path%%:*bin}
/usr/lib64/qt-3.3/bin
[root@localhost wk]# 
替换的表达式形式:${variable/local/bin}

关键字在于那两个斜线,两个斜线中间的是旧字符串,后面的是新字符串,所以结果就会出现如上述的特殊字体部分。

[root@localhost wk]# echo $path
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/java1.8/jdk1.8.0_121/bin:/usr/lib/java1.8/jdk1.8.0_121/jre/bin:/root/bin
[root@localhost wk]# echo ${path/sbin/SBIN}
/usr/lib64/qt-3.3/bin:/usr/local/SBIN:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/java1.8/jdk1.8.0_121/bin:/usr/lib/java1.8/jdk1.8.0_121/jre/bin:/root/bin
[root@localhost wk]# 

上面代码表示把第一个sbin替换为SBIN

[root@localhost wk]# echo ${path//sbin/SBIN}
/usr/lib64/qt-3.3/bin:/usr/local/SBIN:/usr/local/bin:/usr/SBIN:/usr/bin:/usr/lib/java1.8/jdk1.8.0_121/bin:/usr/lib/java1.8/jdk1.8.0_121/jre/bin:/root/bin
[root@localhost wk]# 

如果是双//,则说明把所有的sbin都变成SBIN

在某些时刻我们经常来“判断”某个变量是否存在:如果存在则用既有的值 ,如果不存在则给与一个常用的设置
[root@localhost wk]# echo $ha   //判断变量ha
                                                   //空格说明变量ha没有被设置
[root@localhost wk]# ha=${ha-ha}    //判断ha,如果没有被设置,则设置"ha"的内容给变量ha
[root@localhost wk]# echo $ha
ha
[root@localhost wk]# ha=${ha-hahaha}    //因为变量ha已经被设置了,所以就不能重新赋值了
[root@localhost wk]# echo $ha
ha
[root@localhost wk]# 
如果变量设置的是空值,可以通过以下表达式重新赋值
[root@localhost wk]# ha=""
[root@localhost wk]# echo $ha

[root@localhost wk]# ha=${ha-ha}    //因为变量ha已经被设置了,所以不能重新赋值
[root@localhost wk]# echo $ha

[root@localhost wk]# ha=${ha:-ha}  //因为变量ha是空字符串,所以可以重新赋值
[root@localhost wk]# echo $ha
ha
[root@localhost wk]# 
如果想把旧值也一并替换了,可以用"="
[root@localhost wk]# unset ha;unset haha
[root@localhost wk]# echo $ha,$haha
,
[root@localhost wk]# ha=${haha=haha}  //如果haha也没有被设置,那同时给变量ha和haha设置值
[root@localhost wk]# echo ha="$ha",haha="$haha"
ha=haha,haha=haha
[root@localhost wk]# unset ha;unset haha
[root@localhost wk]# echo $ha,$haha
,
[root@localhost wk]# ha=${haha-haha}  //只给变量ha设置值,没有给haha设置值
[root@localhost wk]# echo ha="$ha",haha="$haha"
ha=haha,haha=
[root@localhost wk]# 
如果变量不存在,则报错提醒,就要用到"?"
[root@localhost wk]# ha=${haha?novar}  //因为没有haha变量,所以会报错
-bash: haha: novar
[root@localhost wk]# ha=${haha=newvar}
[root@localhost wk]# echo ha="$ha",haha="$haha"
ha=newvar,haha=newvar
[root@localhost wk]# ha=${haha?novar}
[root@localhost wk]# echo ha="$ha",haha="$haha"
ha=newvar,haha=newvar
[root@localhost wk]# 

别名(alias)

  当我们看目录下都有什么文件时,习惯输入命令“ll”,其实他是“ls -l”的别名。我们可以通过alias ll='ls -l'设置ll的别名,也可以通过alias命令看都有哪些别名,也可以alias ll看这个别名代表的是什么意思

[root@localhost sbin]# alias lm='ls -all | more'
[root@localhost sbin]# alias
alias cp='cp -i'
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 lm='ls -all | more'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@localhost sbin]# lm
总用量 43528
dr-xr-xr-x.  2 root root       16384 12月 27 10:15 .
drwxr-xr-x. 13 root root         155 12月 29 10:50 ..
-rwxr-xr-x.  1 root root       11720 6月  10 2014 accessdb
-rwxr-xr-x.  1 root root        3126 10月  4 2013 addgnupghome
-rwxr-xr-x.  1 root root       20200 4月  11 2018 addpart
lrwxrwxrwx.  1 root root           7 9月  20 15:31 adduser -> useradd
-rwxr-xr-x.  1 root root       36936 4月  11 2018 agetty
-rwxr-xr-x.  1 root root       28248 8月   4 2017 alternatives
-rwxr-xr-x.  1 root root       36376 4月  11 2018 anacron
-rwxr-xr-x.  1 root root        2264 10月  4 2013 applygnupgdefaults
-rwxr-xr-x.  1 root root       65584 10月 31 00:40 arp
-rwxr-xr-x.  1 root root       50184 4月  11 2018 arpd
-rwxr-xr-x.  1 root root       23744 8月   4 2017 arping
-rwxr-xr-x.  1 root root       27872 10月 31 01:10 atd
-rwxr-xr-x.  1 root root          67 10月 31 01:10 atrun
-rwxr-xr-x.  1 root root       40704 10月 31 04:42 audispd
-rwxr-xr-x.  1 root root       40512 10月 31 04:42 auditctl
-rwxr-xr-x.  1 root root      124536 10月 31 04:42 auditd
-rwxr-xr-x.  1 root root        3791 10月 31 04:42 augenrules
-rwxr-xr-x.  1 root root      103768 10月 31 04:42 aureport
-rwxr-xr-x.  1 root root      112416 10月 31 04:42 ausearch
lrwxrwxrwx.  1 root root          35 9月  20 15:33 authconfig -> /usr/share/authconfig/authconfig.py
lrwxrwxrwx.  1 root root          39 9月  20 15:33 authconfig-tui -> /usr/share/authconfig/authconfig-tui.py
-rwxr-x---.  1 root root       15864 10月 31 04:42 autrace
-rwxr-xr-x.  1 root root       11592 10月 31 05:43 avcstat
-rwxr-xr-x.  1 root root       28352 4月  11 2018 badblocks
-rwxr-xr-x.  1 root root       20432 8月   4 2017 biosdecode
-rwxr-xr-x.  1 root root       37376 4月  11 2018 biosdevname
-r-xr-xr-x.  1 root root       14837 4月  11 2018 blkdeactivate
-rwxr-xr-x.  1 root root       24456 4月  11 2018 blkdiscard
-rwxr-xr-x.  1 root root       75744 4月  11 2018 blkid
-rwxr-xr-x.  1 root root       33032 4月  11 2018 blockdev
-rwxr-xr-x.  1 root root       75336 4月  11 2018 bridge
-rwxr-xr-x.  1 root root      707168 8月   7 2017 btrfs
lrwxrwxrwx.  1 root root           5 9月  20 15:33 btrfsck -> btrfs
-rwxr-xr-x.  1 root root      387704 8月   7 2017 btrfs-convert
-rwxr-xr-x.  1 root root      362736 8月   7 2017 btrfs-debug-tree
-rwxr-xr-x.  1 root root      354528 8月   7 2017 btrfs-find-root
-rwxr-xr-x.  1 root root      383624 8月   7 2017 btrfs-image
-rwxr-xr-x.  1 root root      358672 8月   7 2017 btrfs-map-logical
-rwxr-xr-x.  1 root root      354504 8月   7 2017 btrfs-select-super
-rwxr-xr-x.  1 root root      358648 8月   7 2017 btrfstune
-rwxr-xr-x.  1 root root      354512 8月   7 2017 btrfs-zero-log
-rwx------.  1 root root      877072 10月 30 16:20 build-locale-archive
-rwxr-xr-x.  1 root root         644 8月   4 2017 cacertdir_rehash
lrwxrwxrwx.  1 root root          11 9月  20 15:31 cache_check -> pdata_tools
lrwxrwxrwx.  1 root root          11 9月  20 15:31 cache_dump -> pdata_tools
lrwxrwxrwx.  1 root root          11 9月  20 15:31 cache_metadata_size -> pdata_tools
lrwxrwxrwx.  1 root root          11 9月  20 15:31 cache_repair -> pdata_tools
lrwxrwxrwx.  1 root root          11 9月  20 15:31 cache_restore -> pdata_tools
lrwxrwxrwx.  1 root root          11 9月  20 15:31 cache_writeback -> pdata_tools
--More--

数据流重定向

  当执行一个命令时,这个命令可能会有文件读入数据,经过处理之后,再将数据输出到屏幕上。命令处理分为“标准输出”和“标准错误输出”。数据默认都是输出到屏幕上的,可以通过重定向的功能,将数据输出到文件中。

  1. 标准输入(stdin):代码为0,使用<<或<
  2. 标准输出(stdout):代码为1,使用>>或>
  3. 标准错误输出(stder):代码为2,使用2>>或2>
[root@localhost wk]# ll > test3.txt
[root@localhost wk]# ll
总用量 16
-rw-r--r-- 1 root root  30 1月  17 13:57 test1.txt
-rw-r--r-- 1 root root  16 1月  17 13:56 test2.txt
-rw-r--r-- 1 root root 216 1月  18 14:04 test3.txt
-rw-r--r-- 1 root root  28 1月  17 14:02 test.txt
[root@localhost wk]# cat test3.txt 
总用量 12
-rw-r--r-- 1 root root 30 1月  17 13:57 test1.txt
-rw-r--r-- 1 root root 16 1月  17 13:56 test2.txt
-rw-r--r-- 1 root root  0 1月  18 14:04 test3.txt
-rw-r--r-- 1 root root 28 1月  17 14:02 test.txt
[root@localhost wk]# ll /usr > test3.txt
[root@localhost wk]# cat test3.txt
总用量 136
dr-xr-xr-x.  2 root root 28672 12月 27 10:13 bin
drwxr-xr-x.  2 root root     6 4月  11 2018 etc
drwxr-xr-x.  2 root root     6 4月  11 2018 games
drwxr-xr-x. 37 root root  4096 12月 17 17:48 include
dr-xr-xr-x. 32 root root  4096 12月 17 17:48 lib
dr-xr-xr-x. 42 root root 32768 12月 17 18:01 lib64
drwxr-xr-x. 24 root root  4096 12月 17 17:48 libexec
drwxr-xr-x. 28 root root  4096 1月  17 09:38 local
dr-xr-xr-x.  2 root root 16384 1月  18 13:43 sbin
drwxr-xr-x. 97 root root  4096 12月 17 18:04 share
drwxr-xr-x.  4 root root    34 9月  20 15:30 src
lrwxrwxrwx.  1 root root    10 9月  20 15:30 tmp -> ../var/tmp
[root@localhost wk]# 

  解释一下上面命令的手法:

  1. 该文件(本例中test3.txt)若不存在,系统会自动将它创建起来
  2. 当这个文件存在时,系统就会先将这个文件内容清空,然后再重新将数据写入。
  3. 也就是若以>输出到一个已存在的文件中,那个文件就会被覆盖掉。
  • 如果想要将文件的内容累加而不是清空,则可用>>
[root@localhost wk]# ll >> test3.txt
[root@localhost wk]# cat test3.txt 
总用量 136
dr-xr-xr-x.  2 root root 28672 12月 27 10:13 bin
drwxr-xr-x.  2 root root     6 4月  11 2018 etc
drwxr-xr-x.  2 root root     6 4月  11 2018 games
drwxr-xr-x. 37 root root  4096 12月 17 17:48 include
dr-xr-xr-x. 32 root root  4096 12月 17 17:48 lib
dr-xr-xr-x. 42 root root 32768 12月 17 18:01 lib64
drwxr-xr-x. 24 root root  4096 12月 17 17:48 libexec
drwxr-xr-x. 28 root root  4096 1月  17 09:38 local
dr-xr-xr-x.  2 root root 16384 1月  18 13:43 sbin
drwxr-xr-x. 97 root root  4096 12月 17 18:04 share
drwxr-xr-x.  4 root root    34 9月  20 15:30 src
lrwxrwxrwx.  1 root root    10 9月  20 15:30 tmp -> ../var/tmp
总用量 16
-rw-r--r-- 1 root root  30 1月  17 13:57 test1.txt
-rw-r--r-- 1 root root  16 1月  17 13:56 test2.txt
-rw-r--r-- 1 root root 643 1月  18 14:05 test3.txt
-rw-r--r-- 1 root root  28 1月  17 14:02 test.txt
[root@localhost wk]# 
standard input : < 与 <<

  “<”就要将原来需要有键盘输入的数据改由文件内容来替代。

[db2inst@localhost ~]$ cat > cat.txt   //cat后跟>,意思就是往cat.txt文件里写数据,按ctrl+d是结束输入
cat
tomcat[db2inst@localhost ~]$ cat cat.txt 
cat
tomcat[db2inst@localhost ~]$ cat > tom.txt < cat.txt   //< 就是把cat.txt中的数据写入tom.txt中
[db2inst@localhost ~]$ cat tom.txt 
cat
tomcat[db2inst@localhost ~]$ cat > tom.txt << cat.txt  //<< 往tom.txt文件中写入数据,当遇到cat.txt时推出编辑
> fas
> fdas
> cat.txt
[db2inst@localhost ~]$ 

为什么会有命令输出重定向呢?

  • 屏幕输出的信息很重要,而且我们要将他保存下来
  • 后台执行中的程序,不希望它干扰屏幕正常的输出结果
  • 一些系统的例行命令的执行结果,希望它可以存下来时
  • 一些执行命令的可能已知错误信息时,想以"2>/dev/null"将它丢掉
  • 错误信息与正确信息需要分别输出时

命令执行的判断依据


  •   若想同时执行多个命令,可用";"分隔命令来执行。如
[root@localhost wk]# cat test.txt ;cat test1.txt 
i am xiaotuzi
i am xiaotuzi
wo shi xiaotuzi
i am xiaotuzi
  • &&(与),||(或)
      如果前面的命令结果影响后面的命令执行,则可以用命令回传码
[root@localhost wk]# cat test.txt || cat test1.txt    \\当test.txt存在时,不打开test1.txt
i am xiaotuzi
i am xiaotuzi
[root@localhost wk]# cat test.txt && cat test1.txt   \\当test.txt 存在时,同时打开test.txt 和 test1.txt
i am xiaotuzi
i am xiaotuzi
wo shi xiaotuzi
i am xiaotuzi
[root@localhost wk]# 

管道命令

"|"管道命令

  • 想知道有多少文件
    这个在我们前面学的别名中已经提到过
ls -all | less

可以实现上下翻页等操作。
其实这个管道命令"|"仅能处理经由前面一个命令传来的正确信息,错误信息并没有直接处理的能力。
下面是要注意的两点

  • 管道命令金辉处理standard output,对于standard error output会予以忽略
  • 管道命令必须要能够接受来自前一个命令的数据成为standard input 继续处理才行

选取命令:cut ,grep

cut
  • cut -d '分隔字符' -f fields //用于分隔字符
    -d:后面接分隔字符,与-f一起使用
    -f:依据-d的分隔字符将一段信息切割成为字段,用-f取出第几段的意思
  • cut -c 字符范围
    -c:以字符的单位取出固定字符区间
  1. 如果我想取出$PATH变量中的第五个路径,则可用以下命令
[root@localhost wk]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/java1.8/jdk1.8.0_121/bin:/usr/lib/java1.8/jdk1.8.0_121/jre/bin:/root/bin
[root@localhost wk]# echo $PATH | cut -d ':' -f 5   
/usr/bin
[root@localhost wk]# 
-------
1. 取路径的话,就是要以':'分隔
2. 取第五个就是要-f后跟5
  1. 如果我想去第三个,第五个路径
[root@localhost wk]# echo $PATH | cut -d ':' -f 3,5
/usr/local/bin:/usr/bin
[root@localhost wk]# 
---------
1. 取第几个-f后面就跟数字
  1. 用cut -c 格式化输出
[root@localhost wk]# export
declare -x CLASS_PATH=".:/usr/lib/java1.8/jdk1.8.0_121/lib/dt.jar:/usr/lib/java1.8/jdk1.8.0_121/lib/tools.jar:/usr/lib/java1.8/jdk1.8.0_121/jre/lib"
declare -x HISTCONTROL="ignoredups"
declare -x HISTSIZE="1000"
declare -x HOME="/root"
 ------------  如果我不想要前面的declare -x
[root@localhost wk]# export | cut -c 12-
CLASS_PATH=".:/usr/lib/java1.8/jdk1.8.0_121/lib/dt.jar:/usr/lib/java1.8/jdk1.8.0_121/lib/tools.jar:/usr/lib/java1.8/jdk1.8.0_121/jre/lib"
HISTCONTROL="ignoredups"
HISTSIZE="1000"
HOME="/root"
--------
其中12-就是12个字符开始,到最后。如果是去12到20个字符,那就是12-20
grep
  • grep [-acinv] [--color=auto] '查找字符' filename
    -a:将binary文件以text文件的方式查找数据
    -c:计算找到'查找字符'的次数
    -i:忽略大小写的不通,所有大小写视为相同
    -n:顺便输出行号
    -v:反向选择,即显示出没有'查找字符'内容的那一行
    --color=auto:可以将找到的关键字部分加上颜色显示
  1. 把export中出现'PATH'的那一行取出
[root@localhost wk]# export | grep 'PATH'
declare -x CLASS_PATH=".:/usr/lib/java1.8/jdk1.8.0_121/lib/dt.jar:/usr/lib/java1.8/jdk1.8.0_121/lib/tools.jar:/usr/lib/java1.8/jdk1.8.0_121/jre/lib"
declare -x PATH="/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/java1.8/jdk1.8.0_121/bin:/usr/lib/java1.8/jdk1.8.0_121/jre/bin:/root/bin"
[root@localhost wk]# 
  1. export中只取含PATH的-x后面的字符
[root@localhost wk]# export | grep 'PATH'|cut -d 'x' -f 2
 CLASS_PATH=".:/usr/lib/java1.8/jdk1.8.0_121/lib/dt.jar:/usr/lib/java1.8/jdk1.8.0_121/lib/tools.jar:/usr/lib/java1.8/jdk1.8.0_121/jre/lib"
 PATH="/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/java1.8/jdk1.8.0_121/bin:/usr/lib/java1.8/jdk1.8.0_121/jre/bin:/root/bin"
[root@localhost wk]# 
  1. PATH用特殊的颜色显示出来
[root@localhost wk]# export | grep --color=auto 'PATH'
declare -x CLASS_PATH=".:/usr/lib/java1.8/jdk1.8.0_121/lib/dt.jar:/usr/lib/java1.8/jdk1.8.0_121/lib/tools.jar:/usr/lib/java1.8/jdk1.8.0_121/jre/lib"
declare -x PATH="/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/java1.8/jdk1.8.0_121/bin:/usr/lib/java1.8/jdk1.8.0_121/jre/bin:/root/bin"
[root@localhost wk]# 
排序命令:sort,wc,uniq
  • sort [-fbMnrtuk] [file or stdin]
    -f:忽略大小写的差异
    -b:忽略最前面的空格部分
    -M:以月份的名字来排序
    -n:使用“纯数字”进行排序
    -r:反向排序
    -u:就是uniq,相同的数据中,仅出现一行代表
    -t:分隔符,默认是用[tab]分隔的
    -k:以那个区间来进行排序的意思
-------以首字母排序,默认是以字符类型排序的
[root@localhost wk]# cat /etc/passwd | sort
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
db2fenc1:x:1002:2001::/home/db2fenc1:/bin/bash
db2inst:x:1001:2000::/home/db2inst:/bin/bash
dbus:x:81:81:System message bus:/:/sbin/nologin
dockerroot:x:997:994:Docker User:/var/lib/docker:/sbin/nologin
-----以':'来分隔的,并以第三列排序
[root@localhost wk]# cat /etc/passwd | sort -t ':' -k 3
root:x:0:0:root:/root:/bin/bash
thunisoft:x:1000:1000::/home/thunisoft:/bin/bash
db2inst:x:1001:2000::/home/db2inst:/bin/bash
db2fenc1:x:1002:2001::/home/db2fenc1:/bin/bash
operator:x:11:0:operator:/root:/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
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
----------以数字类型来排序
[root@localhost wk]# cat /etc/passwd | sort -t ':' -k 3 -n
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
  • uniq [-ic] //去除重复的数据
    -i:忽略大小写字符的不同
    -c:进行计数
-------- 只显示用户名
[root@localhost wk]# last | cut -d ' ' -f 1 | sort | uniq

reboot
root
wtmp
[root@localhost wk]# 
--------- 显示每个用户的次数
[root@localhost wk]# last | cut -d ' ' -f 1 | sort | uniq -c
      1 
     15 reboot
    426 root
      1 wtmp
[root@localhost wk]# 
  • wc [-lwm]
    -l:仅列出行
    -w:仅列出多少字
    -m:多少字符
-------列出行、字数、字符数
[root@localhost wk]# cat /etc/passwd | wc
     26      38    1218
------查看last中除去空白行,含wtmp的行数
[root@localhost wk]# last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l
441

双向重定向

  • tee [-a] file
    -a:以累加的方式,将数据加入flie 当中
---------把test.txt的内容写入test2.txt中,并在屏幕上打印出test.txt的内容
[root@localhost wk]# cat test2.txt 
我是小兔子
i am xiaotuzi
i am xiaotuzi
[root@localhost wk]# cat test.txt | tee -a test2.txt 
i am xiaotuzi
i am xiaotuzi
[root@localhost wk]# cat test2.txt 
我是小兔子
i am xiaotuzi
i am xiaotuzi
i am xiaotuzi
i am xiaotuzi
[root@localhost wk]# 

字符转换命令tr,col,join,paste,expand

  • tr [-ds] SET1
    -d:删除信息当中的SET1这个字符串
    -s:替换掉重复的字符
--------把显示的信息小写转成大写
[root@localhost wk]# cat test2.txt | tr '[a-z]' '[A-Z]'
我是小兔子
I AM XIAOTUZI
I AM XIAOTUZI
I AM XIAOTUZI
I AM XIAOTUZI
[root@localhost wk]# 
----------把':'删除
[root@localhost wk]# cat test2.txt | tr -d 'i'
我是小兔子
 am xaotuz
 am xaotuz
 am xaotuz
 am xaotuz
[root@localhost wk]# 
-----------把"xiaotuzi"替换成"xiaolaohu"
[root@localhost wk]# cat test2.txt | tr -s "xiaotuzi" "xiaolaohu"
我是小兔子
h am xhaolaoh
h am xhaolaoh
h am xhaolaoh
h am xhaolaoh
[root@localhost wk]# 
  • col [-xb]
    -x:将tab键转换成对等的空格键
    -b:在文字内有反斜杠(/)时,仅保留反斜杠最后接的那个字符
[root@localhost wk]# cat -A test.txt 
i am xiaotuzi$
i am xiaotuzi$
^I^IM-dM-=M- M-fM-^XM-/M-dM-;M-^@M-dM-9M-^HM-eM-^QM-^@M-oM-<M-^_$
------其中^I就是[tab]键,把[tab]键改为空格
[root@localhost wk]# cat test.txt | col -x | cat -A
i am xiaotuzi$
i am xiaotuzi$
                M-dM-=M- M-fM-^XM-/M-dM-;M-^@M-dM-9M-^HM-eM-^QM-^@M-oM-<M-^_$
  • join [-ti12] file1 file2
    -t:join默认以空格符分隔数据,并且对比“第一段字段”的数据
    -i:忽略大小的差异
    -1:这个是数字1,代表第一个文件要用哪个字段来分析的意思
    -2:代表第二个文件要以哪个字段来分析的意思
  • paste [-d] file1 file2
    -d:后面可以接分隔字符,默认是以[tab]来分隔的
    -:如果file写成-,表示来自standard input的数据的意思
    [root@localhost wk]# paste -d '-' test.txt test1.txt
i am xiaotuzi-i am xiaotuzi
i am xiaotuzi-i am xiaotuzi
        你是什么呀?-
[root@localhost wk]# 
切割命令:split
  • split [-bl] file PREFIX
    -b:后面可接要切割成的文件大小,可加单位,例如b,k,m等
    -l:以行数来进行切割
    PREFIX:代表前导符,可作为切割文件的前导文字

相关文章

网友评论

    本文标题:Shell命令

    本文链接:https://www.haomeiwen.com/subject/uqvbdqtx.html