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
- 设置变量的规则
- 变量与变量内容以一个等号"="来连接
- 等号两边不能直接接空格符
- 变量名只能是英文字母与数字,但是开头不能是数字
- 变量内容若有空格符可使用双引号“"”或单引号“'”将变量内容结合起来。但是
-- 双引号内的特殊字符如“$”等,可以保有原本的特性
-- 单引号内的特殊字符则仅为一般字符(纯文本) - 转义字符“\”将特殊字符“$”转为一般字符
- 若该变量为了增加变量内容时,则可用“$变量名称”或${变量}累加内容
- 若改变量需要在其他字进程执行,则可用export 来使变量变成环境变量
- 取消变量的方法为“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--
数据流重定向
当执行一个命令时,这个命令可能会有文件读入数据,经过处理之后,再将数据输出到屏幕上。命令处理分为“标准输出”和“标准错误输出”。数据默认都是输出到屏幕上的,可以通过重定向的功能,将数据输出到文件中。
- 标准输入(stdin):代码为0,使用<<或<
- 标准输出(stdout):代码为1,使用>>或>
- 标准错误输出(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]#
解释一下上面命令的手法:
- 该文件(本例中test3.txt)若不存在,系统会自动将它创建起来
- 当这个文件存在时,系统就会先将这个文件内容清空,然后再重新将数据写入。
- 也就是若以>输出到一个已存在的文件中,那个文件就会被覆盖掉。
- 如果想要将文件的内容累加而不是清空,则可用>>
[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:以字符的单位取出固定字符区间
- 如果我想取出$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
- 如果我想去第三个,第五个路径
[root@localhost wk]# echo $PATH | cut -d ':' -f 3,5
/usr/local/bin:/usr/bin
[root@localhost wk]#
---------
1. 取第几个-f后面就跟数字
- 用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:可以将找到的关键字部分加上颜色显示
- 把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]#
- 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]#
- 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:代表前导符,可作为切割文件的前导文字
网友评论