第11章 认识和学习bash
认识bash这个shell
硬件、内核和shell
用户操作计算机流程如下:
用户——>用户界面(shell,KDE,application)——>核心(kernel)——>硬件(hardware)
应用程序处于最外层,因此称为shell,shell的功能是提供用户操作系统的一个接口。狭义的shell指的是命令行软件(包括bash),广义的shell包括图形界面软件
系统的合法shell和/etc/shells功能
系统合法的shell都写入到/etc/shells这个软件,查看该文件如下:
[root@localhost wuchao_test]# cat /etc/shells /bin/sh (已经被/bin/bash所替代) /bin/bash (Linux默认的shell) /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin /bin/tcsh /bin/csh [root@localhost wuchao_test]#
用户登陆后可以取得的默认shell都会记录在/etc/passwd文件内:
[root@localhost wuchao_test]# cat /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 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 nobody:x:99:99:Nobody:/:/sbin/nologin avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:997:995:User for polkitd:/:/sbin/nologin abrt:x:173:173::/etc/abrt:/sbin/nologin tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin unbound:x:996:993:Unbound DNS resolver:/etc/unbound:/sbin/nologin usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin colord:x:995:992:User for colord:/var/lib/colord:/sbin/nologin amandabackup:x:33:6:Amanda user:/var/lib/amanda:/bin/bash saslauth:x:994:76:Saslauthd user:/run/saslauthd:/sbin/nologin libstoragemgmt:x:993:990:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin geoclue:x:992:989:User for geoclue:/var/lib/geoclue:/sbin/nologin rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin setroubleshoot:x:991:988::/var/lib/setroubleshoot:/sbin/nologin rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin qemu:x:107:107:qemu user:/:/sbin/nologin rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin radvd:x:75:75:radvd user:/:/sbin/nologin chrony:x:990:987::/var/lib/chrony:/sbin/nologin sssd:x:989:986:User for sssd:/:/sbin/nologin pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin gdm:x:42:42::/var/lib/gdm:/sbin/nologin gnome-initial-setup:x:988:983::/run/gnome-initial-setup/:/sbin/nologin avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin wuchao:x:1000:1000:rootUser(wuchao):/home/wuchao:/bin/bash
bash shell的功能
既然/bin/bash是Linux默认的shell,接下来了解下这个shell。
bash有以下优点:
命令记忆功能
可以记下使用过的命令,只要在命令行按上下关键就可以找到前/后输入过的命令。这些命令记录在~/.bash_history,注意的是该文件只记录上次之前的命令,本次的所有命令暂存在内存里
命令补全功能
tab键接在一串命令的第一个字后面,则为命令补全,tab键接在一串命令的第二个字以后,则为文件补全
命令别名设置
当我们想列出所有文件时,需要输入ls -al命令,更快捷的方式是使用别名代替这个命令,设置别名:alias lm=‘ls -al’
//设置别名 [root@localhost wuchao_test]# alias lm='ls -al' [root@localhost wuchao_test]# lm . total 188 drwxr-xr-x. 2 root root 84 6月 30 20:57 . drwxrwxrwt. 47 root root 4096 7月 1 08:14 .. -rw-r--r--. 1 root root 2370 6月 30 20:52 hosts -rw-r--r--. 1 root root 511 4月 1 01:39 inittab -rw-------. 1 root root 151271 6月 27 13:25 test2.txt -rw-------. 1 root root 20480 6月 30 20:00 .test2.txt.swo -rw-r--r--. 1 root root 44 6月 30 19:19 test.txt //取消别名 [root@localhost wuchao_test]# unalias lm [root@localhost wuchao_test]# lm . bash: lm: command not found... [root@localhost wuchao_test]#
作业控制、前台、后台控制
第17章Linux过程控制部分再讲
程序脚本(shell script)
可以将平时管理系统需要执行的连续命令写成一个文件
通配符
比如查询/usr/bin下有多少以X开头的文件,输入:ls -l /usr/bin/X*
bash shell的内置命令:type
使用type可以查看命令是bash内置的,还是来源于其他
[root@localhost ~]# type ls ls is aliased to `ls --color=auto' [root@localhost ~]# type cd cd is a shell builtin [root@localhost ~]# type which which is aliased to `alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
shell的变量功能
变量的显示与设置:echo,unset
变量的显示:echo $变量名或echo ${变量名}
root@iZ28o1pcxtmZ:~# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/java/jdk1.8.0_77/bin:/usr/local/java/jdk1.8.0_77/bin root@iZ28o1pcxtmZ:~#
变量的设置规则:
1.变量与变量内容用“=”号连接
2.单引号内的字符仅为一般字符,双引号内的特殊字符可保持原有特性
root@iZ28o1pcxtmZ:~# name1='$PATH' root@iZ28o1pcxtmZ:~# name2="$PATH" root@iZ28o1pcxtmZ:~# echo $name1 $PATH root@iZ28o1pcxtmZ:~# echo $name2 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/java/jdk1.8.0_77/bin:/usr/local/java/jdk1.8.0_77/bin root@iZ28o1pcxtmZ:~#
3.可用转义字符“\”将特殊字符变为一般字符
4.在一串命令中,如果还需要其他命令提供信息,使用反单引号`命令`或$(命令)
root@iZ28o1pcxtmZ:~# version=$(uname -r) root@iZ28o1pcxtmZ:~# echo $version 3.13.0-32-generic root@iZ28o1pcxtmZ:~#
5.在变量后追加变量内容,可用“$变量名称”或${变量名称}累加内容
root@iZ28o1pcxtmZ:~# name1=hello root@iZ28o1pcxtmZ:~# name2=${name1}wuchao root@iZ28o1pcxtmZ:~# echo $name2 hellowuchao root@iZ28o1pcxtmZ:~#
6.若该变量需要在其他子进程使用,需要export来使变量称为环境变量
环境变量的功能
用env查看环境变量
[root@localhost 桌面]# env XDG_VTNR=1 XDG_SESSION_ID=1 SSH_AGENT_PID=3304 HOSTNAME=localhost.localdomain IMSETTINGS_INTEGRATE_DESKTOP=yes GPG_AGENT_INFO=/run/user/0/keyring/gpg:0:1 VTE_VERSION=3803 XDG_MENU_PREFIX=gnome- SHELL=/bin/bash TERM=xterm-256color HISTSIZE=1000 WINDOWID=35651591 IMSETTINGS_MODULE=IBus USER=root LS_COLORS=rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arc=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lha=38;5;9:*.lz4=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.tzo=38;5;9:*.t7z=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lrz=38;5;9:*.lz=38;5;9:*.lzo=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.bz=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.war=38;5;9:*.ear=38;5;9:*.sar=38;5;9:*.rar=38;5;9:*.alz=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.cab=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.webm=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.axv=38;5;13:*.anx=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.axa=38;5;45:*.oga=38;5;45:*.spx=38;5;45:*.xspf=38;5;45: SSH_AUTH_SOCK=/run/user/0/keyring/ssh SESSION_MANAGER=local/unix:@/tmp/.ICE-unix/3141,unix/unix:/tmp/.ICE-unix/3141 USERNAME=root GNOME_SHELL_SESSION_MODE=classic DESKTOP_SESSION=gnome-classic MAIL=/var/spool/mail/root PATH=/usr/local/java/jdk1.8.0_91/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin QT_IM_MODULE=ibus PWD=/root/桌面 JAVA_HOME=/usr/local/java/jdk1.8.0_91 XMODIFIERS=@im=ibus LANG=zh_CN.UTF-8 GDM_LANG=zh_CN.UTF-8 GDMSESSION=gnome-classic HISTCONTROL=ignoredups SHLVL=2 HOME=/root XDG_SEAT=seat0 GNOME_DESKTOP_SESSION_ID=this-is-deprecated LOGNAME=root XDG_SESSION_DESKTOP=gnome-classic CLASSPATH=/usr/local/java/jdk1.8.0_91/jre/lib/ext:/usr/local/java/jdk1.8.0_91/lib/tools.jar DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-XFSA7YGZp6,guid=46b270284336ec9172459a4e5777171e LESSOPEN=||/usr/bin/lesspipe.sh %s WINDOWPATH=1 DISPLAY=:0 XDG_RUNTIME_DIR=/run/user/0 XDG_CURRENT_DESKTOP=GNOME-Classic:GNOME XAUTHORITY=/run/gdm/auth-for-root-Qkf798/database _=/usr/bin/env [root@localhost 桌面]#
以下对几个常见的环境变量简单的介绍下:
HOME:代表用户的主文件夹
SHELL:告知目前环境使用的shell是哪个程序
HISTSIZE:历史命令的记录数
MAIL:当我们使用mail命令时,系统读取的邮件信箱文件
LANG:语系数据,英文通常为en_US.UTF-8,中文通常是zh_CN.gb2312和zh_CN.UTF-8
RANDOM:随机数的变量,可以通过$RANDOM获取,范围为0~32767
set查看所有变量(环境变量和自定义变量)
[root@localhost 桌面]# set ABRT_DEBUG_LOG=/dev/null BASH=/bin/bash BASHOPTS=checkwinsize:cmdhist:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath BASH_ALIASES=() BASH_ARGC=() BASH_ARGV=() BASH_CMDS=() BASH_COMPLETION_COMPAT_DIR=/etc/bash_completion.d BASH_LINENO=() BASH_SOURCE=() BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu") BASH_VERSION='4.2.46(1)-release' CLASSPATH=/usr/local/java/jdk1.8.0_91/jre/lib/ext:/usr/local/java/jdk1.8.0_91/lib/tools.jar COLUMNS=80 COMP_WORDBREAKS=$' \t\n"\'><=;|&(:' DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-XFSA7YGZp6,guid=46b270284336ec9172459a4e5777171e DESKTOP_SESSION=gnome-classic DIRSTACK=() DISPLAY=:0 EUID=0 GDMSESSION=gnome-classic GDM_LANG=zh_CN.UTF-8 GNOME_DESKTOP_SESSION_ID=this-is-deprecated GNOME_SHELL_SESSION_MODE=classic GPG_AGENT_INFO=/run/user/0/keyring/gpg:0:1 GROUPS=() HISTCONTROL=ignoredups HISTFILE=/root/.bash_history HISTFILESIZE=1000 HISTSIZE=1000 HOME=/root HOSTNAME=localhost.localdomain HOSTTYPE=x86_64 ID=0 IFS=$' \t\n' IMSETTINGS_INTEGRATE_DESKTOP=yes IMSETTINGS_MODULE=IBus JAVA_HOME=/usr/local/java/jdk1.8.0_91 LANG=zh_CN.UTF-8 LESSOPEN='||/usr/bin/lesspipe.sh %s' LINES=24 LOGNAME=root LPATHDIR=/root/.cache/abrt LS_COLORS='rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arc=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lha=38;5;9:*.lz4=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.tzo=38;5;9:*.t7z=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lrz=38;5;9:*.lz=38;5;9:*.lzo=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.bz=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.war=38;5;9:*.ear=38;5;9:*.sar=38;5;9:*.rar=38;5;9:*.alz=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.cab=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.webm=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.axv=38;5;13:*.anx=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.axa=38;5;45:*.oga=38;5;45:*.spx=38;5;45:*.xspf=38;5;45:' MACHTYPE=x86_64-redhat-linux-gnu MAIL=/var/spool/mail/root MAILCHECK=60 OPTERR=1 OPTIND=1 OSTYPE=linux-gnu PATH=/usr/local/java/jdk1.8.0_91/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin PIPESTATUS=([0]="0") PPID=3879 PROMPT_COMMAND=__vte_prompt_command PS1='[\u@\h \W]\$ ' PS2='> ' PS4='+ ' PWD=$'/root/\346\241\214\351\235\242' QT_IM_MODULE=ibus SESSION_MANAGER=local/unix:@/tmp/.ICE-unix/3141,unix/unix:/tmp/.ICE-unix/3141 SHELL=/bin/bash SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor SHLVL=2 SINCE=1467076530 SINCEFILE=/root/.cache/abrt/lastnotification SSH_AGENT_PID=3304 SSH_AUTH_SOCK=/run/user/0/keyring/ssh TERM=xterm-256color TMPPATH=/root/.cache/abrt/lastnotification.w46b8i8T UID=0 USER=root USERNAME=root VTE_VERSION=3803 WINDOWID=35651591 WINDOWPATH=1 XAUTHORITY=/run/gdm/auth-for-root-Qkf798/database XDG_CURRENT_DESKTOP=GNOME-Classic:GNOME XDG_MENU_PREFIX=gnome- XDG_RUNTIME_DIR=/run/user/0 XDG_SEAT=seat0 XDG_SESSION_DESKTOP=gnome-classic XDG_SESSION_ID=1 XDG_VTNR=1 XMODIFIERS=@im=ibus //后面省略
上面会列出很多变量,记住几个比较重要的变量:
PS1:提示符设置
\d:显示星期月日的日期格式
\H:完整的主机名
\h:主机名第一个小数点前面的部分
\t:显示时间,24小时格式,HH:MM:SS
\T:显示时间,12小时格式,HH:MM:SS
\A:显示时间,24小时格式,HH:MM
\@:显示时间,12小时,am/pm样式
\u:目前用户的账号名称
\v:BASH的版本
\w:完整的工作目录名称
\W:利用basename取得的工作目录名称,所有仅会列出最后一个目录名
\#:执行的第几个命令
\$:提示符,如果是root时显示#
查看上面内容可知PS1='[\u@\h \W]\$ ',故命令行显示[root@localhost ~]#
OSTYPE,HOSTYPE,MACHTYPE
主机硬件与内核等级
export:自定义变量转成环境变量
当我们登陆Linux时便取得一个bash,这个bash就是一个独立的进程,在这个bash执行的命令都是由这个bash衍生出来的,因此被执行的命令称为子进程,子进程仅会继承父进程的环境变量,不会继承自定义变量。
使用“export 变量名”将自定义变量设为环境变量,使用“export”可以查看所有的环境变量。
影响显示结果的语系变量(local)
使用locale -a查看所有支持的语系
[root@localhost ~]# locale -a en_AG en_AG.utf8 en_AU en_AU.iso88591 en_AU.utf8 en_BW en_BW.iso88591 en_BW.utf8 en_CA en_CA.iso88591 en_CA.utf8 en_DK en_DK.iso88591 en_DK.utf8 en_GB en_GB.iso88591 en_GB.iso885915 en_GB.utf8 en_HK en_HK.iso88591 en_HK.utf8 en_IE en_IE@euro en_IE.iso88591 en_IE.iso885915@euro en_IE.utf8 en_IN en_IN.utf8 en_NG en_NG.utf8 en_NZ en_NZ.iso88591 en_NZ.utf8 en_PH en_PH.iso88591 en_PH.utf8 en_SG en_SG.iso88591 en_SG.utf8 en_US en_US.iso88591 en_US.iso885915 en_US.utf8 en_ZA en_ZA.iso88591 en_ZA.utf8 en_ZM en_ZM.utf8 en_ZW en_ZW.iso88591 en_ZW.utf8 //省略 zh_CN zh_CN.gb18030 zh_CN.gb2312 zh_CN.gbk zh_CN.utf8 zh_HK zh_HK.big5hkscs zh_HK.utf8 zh_SG zh_SG.gb2312 zh_SG.gbk zh_SG.utf8 zh_TW zh_TW.big5 zh_TW.euctw zh_TW.utf8 zu_ZA zu_ZA.iso88591 zu_ZA.utf8 [root@localhost ~]#
查看需要设置的语系变量
直接输入locale
[root@localhost ~]# locale LANG=zh_CN.UTF-8 LC_CTYPE="zh_CN.UTF-8" LC_NUMERIC="zh_CN.UTF-8" LC_TIME="zh_CN.UTF-8" LC_COLLATE="zh_CN.UTF-8" LC_MONETARY="zh_CN.UTF-8" LC_MESSAGES="zh_CN.UTF-8" LC_PAPER="zh_CN.UTF-8" LC_NAME="zh_CN.UTF-8" LC_ADDRESS="zh_CN.UTF-8" LC_TELEPHONE="zh_CN.UTF-8" LC_MEASUREMENT="zh_CN.UTF-8" LC_IDENTIFICATION="zh_CN.UTF-8" LC_ALL= [root@localhost ~]#
当设置了LANG或者LC_ALL时,其他的语系变量都会被这两个变量替换,所以我们通常只设置LANG变量即可。centos7以前在/etc/sysconfig/i18n设置,centos7在/etc/loacle.conf文件设置LANG="zh_CN.UTF-8"
变量的有效范围
环境变量可以被子进程使用,类似于全局变量,其余变量不可以被子进程使用,类似于局部变量。
变量键盘的读取、数组与声明:read,array,declare
read
读取来自键盘输入的变量
read [-pt] 变量名
参数:
-p:后面可以接提示符
-t:后面接等待的秒数
[root@localhost 桌面]# read -p "please input your name:" -t 20 name please input your name:wuchao [root@localhost 桌面]# echo $name wuchao [root@localhost 桌面]#
declare/typeset
declare和typeset是一样的功能,就是声明变量的类型
如果declare后面不接任何参数,功能和set一样,显示所有变量和内容
declare [-aixr] 变量名
参数:
-a:将变量定义为数组
-i:将变量定义为整型
-x:定义为环境变量
-r:将变量定义为readonly,不能更改内容,也不能重设
//变量类型默认为字符串 [root@localhost 桌面]# sum=100+200+300 [root@localhost 桌面]# echo $sum 100+200+300 //定义为整型,后面才会当成计算式 [root@localhost 桌面]# declare -i sum=100+200+300 [root@localhost 桌面]# echo $sum 600 [root@localhost 桌面]#
数组类型:
[root@localhost 桌面]# var[1]="cat" [root@localhost 桌面]# var[2]="dag" [root@localhost 桌面]# var[3]="monkey" [root@localhost 桌面]# echo "${var[1]},${var[2]},${var[3]}" cat,dag,monkey [root@localhost 桌面]#
与文件系统及程序的限制关系:ulimit
ulimit [-SHacdfltu] [配额]
变量内容的删除、替代与替换
变量的删除与替换
#定义一个变量并赋值 [wuchao@localhost 桌面]$ value=/wuchao/bin:/wuchao/sbin:/root/bin:/root/sbin [wuchao@localhost 桌面]$ echo $value /wuchao/bin:/wuchao/sbin:/root/bin:/root/sbin #删除变量从左侧开始匹配的最短字符“/*wuchao/sbin:”,*表示匹配0到多个字符 [wuchao@localhost 桌面]$ echo ${value#/*wuchao/sbin:} /root/bin:/root/sbin #删除变量从左侧开始匹配的最短字符“/*:”,*表示匹配0到多个字符 [wuchao@localhost 桌面]$ echo ${value#/*:} /wuchao/sbin:/root/bin:/root/sbin #删除变量从左侧开始匹配的最长字符“/*:”,*表示匹配0到多个字符 [wuchao@localhost 桌面]$ echo ${value##/*:} /root/sbin
#表示从左侧匹配删除,%表示从右侧匹配删除,/表示匹配替换
变量设置方式 | 说明 |
${变量#关键字} | 从头开始匹配,删除符合的最短匹配内容 |
${变量##关键字} | 从头开始匹配,删除符合的最长匹配内容 |
${变量%关键字} | 从尾开始匹配,删除符合的最短匹配内容 |
${变量%%关键字} | 从尾开始匹配,删除符合的最长匹配内容 |
${变量/旧字符/新字符} | 把第一个符合的旧字符用新字符替换 |
${变量//旧字符/新字符} | 把所有符合的旧字符用新字符替换 |
变量的测试与内容替换
new_var=${old_var-content}
判断一个变量是否存在,若不存在,则设置该变量
[wuchao@localhost 桌面]$ echo ${username-wuchao} wuchao
new_var=${old_var:-content}
判断一个变量是否存在,若不存在或者为空字符,则设置该变量
[wuchao@localhost 桌面]$ username="" [wuchao@localhost 桌面]$ echo ${username:-wuchao} wuchao [wuchao@localhost 桌面]$
命令别名与历史命令
命令别名设置:alias,unalias
格式:alias lm='ls -l | more'
取消别名:unalias lm
历史命令:history
history [n] :列出最近n条命令
history:列出目前内存中的所有命令
历史命令的执行:
//查看内存中的历史命令 [wuchao@localhost 桌面]$ history 1 tar VMware Tools 2 tar --help 3 cd /tmp 4 ls -a 5 ls mount-point 6 mount 7 df 8 ls -a 9 value=wuchao/bin:wuchao/sbin:root/bin/root/sbin 10 echo $value 11 echo ${value#/*wuchao/sbin:} 12 echo ${value#*wuchao/sbin:} 13 value=wuchao/bin:wuchao/sbin:root/bin/root/sbin 14 value=/wuchao/bin:/wuchao/sbin:/root/bin:/root/sbin 15 echo $value 16 echo ${value#/*wuchao/sbin:} 17 echo ${value#/*:} 18 echo ${value##/*:} 19 echo ${username-wuchao} 20 username="" 21 new_var=${old_var-content} 22 判断一个变量是否存在,若不存在,则设置该变量 23 username="" 24 echo ${username:wuchao} 25 echo ${username:-wuchao} 26 history 27 history -r 28 tar VMware Tools 29 tar --help 30 cd /tmp 31 ls -a 32 ls mount-point 33 mount 34 df 35 ls -a 36 history //执行第4条历史命令 [wuchao@localhost 桌面]$ !4 ls -a . .. VMware Tools //执行以d开头的历史命令 [wuchao@localhost 桌面]$ !d df 文件系统 1K-块 已用 可用 已用% 挂载点 /dev/mapper/centos-root 49746196 6395416 43350780 13% / devtmpfs 1417484 0 1417484 0% /dev tmpfs 1432772 156 1432616 1% /dev/shm tmpfs 1432772 9104 1423668 1% /run tmpfs 1432772 0 1432772 0% /sys/fs/cgroup /dev/sda1 508588 160376 348212 32% /boot tmpfs 286556 16 286540 1% /run/user/1000 [wuchao@localhost 桌面]$
Bash Shell的操作环境
路径与命令查找顺序
- 以相对或绝对路径执行命令,如“/bin/ls“
- 由alias找到执行的命令
- 由bash内置命令来执行
- 通过$PATH这个变量的顺序找到的第一个命令
bash的登陆与欢迎信息:/etc/issue,/etc/motd
登陆时的提示符放在/etc/issue内
登陆后的欢迎信息放在/etc/motd内
bsh的环境配置文件
配置文件用于bash启动时的环境配置,比如自定义变量,别名等。
首先了解login shell和non-login shell的区别:
login shell:取得bash时所需的完整登录流程
non-login shell:取得bash接口的方法不需要重复登录的举动
login shell会读取以下两个配置文件:
1. /etc/profile:这是系统整体的设置,不建议修改
2. ~/.bash_profile或~/.bash_login或~/.profile :属于用户个人设置,可以在此修改
/etc/profile(login shell才会读)
配置用户的整体环境
PATH:会依据UID决定PATH变量要不要含有sbin的系统命令目录
MAIL:根据账号设置用户的邮箱到/var/spool/mail/账户名
USER:根据账户名设置
HOSTNAME:依据主机的hostname设置
HISTSIZE:设置历史纪录命令数
[wuchao@localhost ~]$ cat /etc/profile # /etc/profile # System wide environment and startup programs, for login setup # Functions and aliases go in /etc/bashrc # It's NOT a good idea to change this file unless you know what you # are doing. It's much better to create a custom.sh shell script in # /etc/profile.d/ to make custom changes to your environment, as this # will prevent the need for merging in future updates. pathmunge () { case ":${PATH}:" in *:"$1":*) ;; *) if [ "$2" = "after" ] ; then PATH=$PATH:$1 else PATH=$1:$PATH fi esac } if [ -x /usr/bin/id ]; then if [ -z "$EUID" ]; then # ksh workaround EUID=`id -u` UID=`id -ru` fi USER="`id -un`" LOGNAME=$USER MAIL="/var/spool/mail/$USER" fi # Path manipulation if [ "$EUID" = "0" ]; then pathmunge /usr/sbin pathmunge /usr/local/sbin else pathmunge /usr/local/sbin after pathmunge /usr/sbin after fi HOSTNAME=`/usr/bin/hostname 2>/dev/null` HISTSIZE=1000 if [ "$HISTCONTROL" = "ignorespace" ] ; then export HISTCONTROL=ignoreboth else export HISTCONTROL=ignoredups fi export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL # By default, we want umask to get set. This sets it for login shell # Current threshold for system reserved uid/gids is 200 # You could check uidgid reservation validity in # /usr/share/doc/setup-*/uidgid file if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then umask 002 else umask 022 fi for i in /etc/profile.d/*.sh ; do if [ -r "$i" ]; then if [ "${-#*i}" != "$-" ]; then . "$i" else . "$i" >/dev/null fi fi done unset i unset -f pathmunge JAVA_HOME=/usr/local/java/jdk1.8.0_91 PATH=$JAVA_HOME/bin:$PATH CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar export PATH JAVA_HOME CLASSPATH [wuchao@localhost ~]$
~/.bash_profile(login shell才会读)
bash读取了整体环境配置文件/etc/profile后,利用该文件读取用户的个人配置。个人配置文件包括以下三个:
1. ~/.bash_profile
2. ~/.bash_login
3. ~/.profile
实际上,bash的login shell只会读取上面三个文件中的一个,依据顺序读取,第一个存在时,便只会读取第一个。
[wuchao@localhost ~]$ cat ~/.bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/.local/bin:$HOME/bin export PATH [wuchao@localhost ~]$
source:读取环境配置
source 配置文件名:将主文件夹~/.bashrc的设置读入到目前的bash环境
也可以表示为“. ~/.bashrc”,如上面示例中的if语句内所示,如果~/.bashrc存在,则读取该文件。
~/.bashrc(non-login shell会读)
# .bashrc # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi # Uncomment the following line if you don't like systemctl's auto-paging feature: # export SYSTEMD_PAGER= # User specific aliases and functions [wuchao@localhost ~]$
可以看出,该配置文件还会调用/etc/bashrc
通配符与特殊符号
通配符如下:
符号 | 意义 |
* | 代表0到无穷个任意字符 |
? | 代表一定有一个字符 |
[] | 代表一定有一个在括号内的字符 |
[-] | 代表在编码顺序内的所有字符,[0-9]代表0-9直接的所有数字 |
[^] | [^abc]表示不是abc的其他字符 |
bash环境的其他特殊符号:
符号 | 意义 |
# | 批注符号,后面内容不执行 |
\ | 转义 |
| | 管道,分隔两个管道命令的界定 |
; | 连续命令执行分隔符 |
~ | 用户的主文件夹 |
$ | 使用变量前导符 |
& | 作业控制,将命令变成背景下工作 |
! | 逻辑非 |
/ | 路径分割符 |
>,>> | 数据流重定向,输出导向,分别是“替换”和“累加” |
<,<< | 数据流重定向,输入导向 |
‘’ | 单引号,不具有变量置换的功能 |
“” | 具有变量置换的功能 |
·· | 两个“·”中间为先执行的命令,也可以表示为$() |
() | 在中间为子shell的起始与结束 |
{} | 在中间为命令块的组合 |
数据流重定向
什么是数据流重定向
将某个命令执行后应该要显示在屏幕上的数据传输到其他的地方。
1.标准输入:代码0,使用<或<<
2.标准输出:代码1,使用>或>>
3.标准错误输出:代码2,使用2>或2>>
//列出根目录的文件名,重定向到~/rootfile文件中 [wuchao@localhost ~]$ ls -l / > ~/rootfile //查看该文件 [wuchao@localhost ~]$ ls -l ~/rootfile -rw-rw-r--. 1 wuchao wuchao 1156 7月 14 19:00 /home/wuchao/rootfile [wuchao@localhost ~]$
注意:使用“>”时,当文件不存在则创建文件,当存在时,覆盖文件内容,使用“>>”则在原来文件后追加数据。
注意:若要将标准输出和标准错误输出都指向同一个文件,可以使用“> filename 2>&1”或者"&> filename"
//在cat后加入>后,catfile文件将主动创建,键盘输入内容放在该文件,ctrl+d退出 [wuchao@localhost ~]$ cat > catfile this is a testing file test [wuchao@localhost ~]$ cat catfile this is a testing file test //用某个文件的内容代替键盘输入 [wuchao@localhost ~]$ cat > catfile < ~/.bashrc [wuchao@localhost ~]$ ls -l catfile ~/.bashrc -rw-rw-r--. 1 wuchao wuchao 231 7月 14 19:19 catfile -rw-r--r--. 1 wuchao wuchao 231 11月 20 2015 /home/wuchao/.bashrc [wuchao@localhost ~]$
“<<”表示结束输入
[wuchao@localhost ~]$ cat > catfile << "end" > this is test > test > end //输入end后,自动退出 [wuchao@localhost ~]$
命令执行的判断依据: ; , && ||
cmd;cmd (不考虑命令相关性的连续执行)
比如:
[wuchao@localhost ~]$ sync;sync;shutdown -h now
$?(命令回传码)与&&或||
命令 | 说明 |
cmd1 && cmd2 |
若cmd1执行完毕且正确执行($?=0),则开始执行cmd2 若cmd1执行完毕且为错误($?不为0),则不执行cmd2 |
cmd1 || cmd2 |
若cmd1执行完毕且正确执行($?=0),则不执行cmd2 若cmd1执行完毕且为错误($?不为0),则执行cmd2 |
管道命令
1.管道命令仅会处理标准输出,对于标注错误输出则会忽略
2.管道命令必须能够接受来自前一个命令的数据成为标准输入继续处理才行
选取命令:cut,grep
cut:将一段信息的某一段切出来
cut -d ‘分隔符’ -f fields
-d:后面接分隔符
-f:后面接选取第几段
-c:以字符的单位取出固定字符区间
[wuchao@localhost ~]$ echo $PATH /usr/local/java/jdk1.8.0_91/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/wuchao/.local/bin:/home/wuchao/bin //以‘:’分割,选取第3和第5段 [wuchao@localhost ~]$ echo $PATH | cut -d ':' -f 3,5 /usr/local/sbin:/usr/sbin [wuchao@localhost ~]$ export declare -x XDG_CURRENT_DESKTOP="GNOME-Classic:GNOME" declare -x XDG_MENU_PREFIX="gnome-" declare -x XDG_RUNTIME_DIR="/run/user/1000" declare -x XDG_SEAT="seat0" declare -x XDG_SESSION_DESKTOP="gnome-classic" declare -x XDG_SESSION_ID="1" declare -x XDG_VTNR="1" declare -x XMODIFIERS="@im=ibus" //显示第12个及以后的字符 [wuchao@localhost ~]$ export | cut -c 12- XDG_CURRENT_DESKTOP="GNOME-Classic:GNOME" XDG_MENU_PREFIX="gnome-" XDG_RUNTIME_DIR="/run/user/1000" XDG_SEAT="seat0" XDG_SESSION_DESKTOP="gnome-classic" XDG_SESSION_ID="1" XDG_VTNR="1" XMODIFIERS="@im=ibus" [wuchao@localhost ~]$
grep:分析一行信息,若有需要的则拿出来
grep [-acinv] [--color=auto] '查找字符串' filename
参数:
-a:将binary文件以test文件的方式查找
-c:计算查找到字符串的次数
-i:忽略大小写
-n:顺便输出行号
-v:反向选择,即显示没有查找到字符串的那一行
--color=auto:将查找到的关键字部分加颜色显示
//显示最后登录用户信息中含有root字符串的行
[wuchao@localhost ~]$ last | grep 'root' root pts/1 :0 Sat Jul 2 10:26 - crash (11+05:40) root pts/0 :0 Sat Jul 2 09:22 - crash (11+06:43) root :0 :0 Sat Jul 2 09:21 - crash (11+06:44) root pts/0 :0 Tue Jun 28 09:15 - 09:16 (00:01) root :0 :0 Tue Jun 28 08:47 - crash (4+00:31) root pts/0 :0 Mon Jun 27 13:16 - crash (19:23) root :0 :0 Mon Jun 27 13:15 - crash (19:25) root tty1 Mon Jun 27 11:30 - 11:30 (00:00) root tty2 Mon Jun 27 08:19 - crash (1+00:20) root pts/0 :0 Mon Jun 27 07:23 - 11:30 (04:07) root :0 :0 Sun Jun 26 20:56 - 11:30 (14:34) root :0 :0 Fri May 20 20:37 - crash (36+23:55) root pts/0 :0 Thu May 5 22:00 - crash (14+22:33) root :0 :0 Thu May 5 21:57 - crash (14+22:35) root pts/0 :0 Thu May 5 19:50 - 20:53 (01:03) root :0 :0 Thu May 5 19:37 - 20:53 (01:16) root pts/1 :0 Thu May 5 19:01 - 19:16 (00:14) root pts/0 :0 Thu May 5 18:24 - 19:16 (00:51) root :0 :0 Thu May 5 18:23 - 19:16 (00:52) root pts/0 :0 Thu Apr 28 19:10 - 21:52 (02:41) root pts/0 :0 Thu Apr 28 19:10 - 19:10 (00:00) root :0 :0 Thu Apr 28 18:30 - 21:52 (03:22)
排序命令:sort,wc,uniq
sort
sort [-fbMnrtuk] [file or stdin]
参数:
-f:忽略大小写的差异
-b:忽略最前面的空格部分
-M:以月份的名称排序
-n:使用纯数字排序
-r:反向排序
-u:相同的数据,仅显示一行
-t:分隔符,默认是tab键来分割
-k:以那个区间来排序
[wuchao@localhost ~]$ cat /etc/passwd | sort abrt:x:173:173::/etc/abrt:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin chrony:x:991:988::/var/lib/chrony:/sbin/nologin colord:x:995:993:User for colord:/var/lib/colord:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin gdm:x:42:42::/var/lib/gdm:/sbin/nologin geoclue:x:994:991:User for geoclue:/var/lib/geoclue:/sbin/nologin gnome-initial-setup:x:988:983::/run/gnome-initial-setup/:/sbin/nologin halt:x:7:0:halt:/sbin:/sbin/halt
uniq
uniq [-ic]
参数:
-i:忽略大小写
-c:进行计数
wc
计算数据有多少字,多少行,多少字符
wc [-lwm]
参数:
-l:仅列出行
-w:仅列出多少字
-m:多少字符
双向重定向:tee
tee会同时将数据流送到文件和屏幕
tee [-a] file
参数:
-a:以累加的方式,将数据写入file
[wuchao@localhost 桌面]$ last | tee last.list | cut -d " " -f 1 wuchao wuchao (unknown reboot wuchao wuchao wuchao wuchao wuchao (unknown reboot root root root (unknown reboot root root (unknown wuchao
//查看写入文件的内容
[wuchao@localhost 桌面]$ cat last.list
wuchao pts/0 :0 Fri Jul 15 09:31 still logged in
wuchao :0 :0 Fri Jul 15 09:29 still logged in
(unknown :0 :0 Fri Jul 15 09:16 - 09:29 (00:13)
reboot system boot 3.10.0-327.el7.x Fri Jul 15 09:15 - 09:32 (00:16)
wuchao pts/0 :0 Thu Jul 14 21:26 - crash (11:48)
wuchao pts/0 :0 Thu Jul 14 19:16 - 21:26 (02:10)
wuchao pts/0 :0 Wed Jul 13 16:54 - 19:16 (1+02:22)
wuchao pts/0 :0 Wed Jul 13 16:08 - 16:08 (00:00)
wuchao :0 :0 Wed Jul 13 16:07 - crash (1+17:07)
(unknown :0 :0 Wed Jul 13 16:06 - 16:07 (00:00)
reboot system boot 3.10.0-327.el7.x Wed Jul 13 16:06 - 09:32 (1+17:26)
root pts/1 :0 Sat Jul 2 10:26 - crash (11+05:40)
root pts/0 :0 Sat Jul 2 09:22 - crash (11+06:43)
root :0 :0 Sat Jul 2 09:21 - crash (11+06:44)
(unknown :0 :0 Sat Jul 2 09:20 - 09:21 (00:01)
reboot system boot 3.10.0-327.el7.x Sat Jul 2 09:19 - 09:32 (13+00:12)
root pts/0 :0 Tue Jun 28 09:15 - 09:16 (00:01)
root :0 :0 Tue Jun 28 08:47 - crash (4+00:31)
(unknown :0 :0 Tue Jun 28 08:47 - 08:47 (00:00)
wuchao pts/0 :0 Tue Jun 28 08:46 - 08:47 (00:00)
wuchao :0 :0 Tue Jun 28 08:43 - 08:47 (00:04)
(unknown :0 :0 Tue Jun 28 08:41 - 08:43 (00:01)
reboot system boot 3.10.0-327.el7.x Tue Jun 28 08:40 - 09:32 (17+00:51)
root pts/0 :0 Mon Jun 27 13:16 - crash (19:23)
root :0 :0 Mon Jun 27 13:15 - crash (19:25)
(unknown :0 :0 Mon Jun 27 11:30 - 13:15 (01:44)
root tty1 Mon Jun 27 11:30 - 11:30 (00:00)
root tty2 Mon Jun 27 08:19 - crash (1+00:20)
root pts/0 :0 Mon Jun 27 07:23 - 11:30 (04:07)
root :0 :0 Sun Jun 26 20:56 - 11:30 (14:34)
字符转换命令:tr,col,join,paste,expand
tr
删除或替换一段信息中的文字
tr [-ds] SET1 ...
参数:
-d:删除信息中的SET1字符串
-s:替换重复的字符串
//将小写转为大写 [wuchao@localhost 桌面]$ last | tr '[a-z]' '[A-Z' WUCHAO PTS/0 :0 FRI JUL 15 09:31 STILL LOGGED IN WUCHAO :0 :0 FRI JUL 15 09:29 STILL LOGGED IN (UNKNOWN :0 :0 FRI JUL 15 09:16 - 09:29 (00:13) REBOOT SYSTEM BOOT 3.10.0-327.EL7.X FRI JUL 15 09:15 - 09:40 (00:24) WUCHAO PTS/0 :0 THU JUL 14 21:26 - CRASH (11:48) WUCHAO PTS/0 :0 THU JUL 14 19:16 - 21:26 (02:10) WUCHAO PTS/0 :0 WED JUL 13 16:54 - 19:16 (1+02:22) WUCHAO PTS/0 :0 WED JUL 13 16:08 - 16:08 (00:00) WUCHAO :0 :0 WED JUL 13 16:07 - CRASH (1+17:07) (UNKNOWN :0 :0 WED JUL 13 16:06 - 16:07 (00:00) REBOOT SYSTEM BOOT 3.10.0-327.EL7.X WED JUL 13 16:06 - 09:40 (1+17:34) ROOT PTS/1 :0 SAT JUL 2 10:26 - CRASH (11+05:40) ROOT PTS/0 :0 SAT JUL 2 09:22 - CRASH (11+06:43) ROOT :0 :0 SAT JUL 2 09:21 - CRASH (11+06:44) (UNKNOWN :0 :0 SAT JUL 2 09:20 - 09:21 (00:01) REBOOT SYSTEM BOOT 3.10.0-327.EL7.X SAT JUL 2 09:19 - 09:40 (13+00:20) ROOT PTS/0 :0 TUE JUN 28 09:15 - 09:16 (00:01) ROOT :0 :0 TUE JUN 28 08:47 - CRASH (4+00:31) (UNKNOWN :0 :0 TUE JUN 28 08:47 - 08:47 (00:00) WUCHAO PTS/0 :0 TUE JUN 28 08:46 - 08:47 (00:00) WUCHAO :0 :0 TUE JUN 28 08:43 - 08:47 (00:04) //删除“:”后显示 wuchao@localhost 桌面]$ cat /etc/passwd | tr -d ':' rootx00root/root/bin/bash binx11bin/bin/sbin/nologin daemonx22daemon/sbin/sbin/nologin admx34adm/var/adm/sbin/nologin lpx47lp/var/spool/lpd/sbin/nologin syncx50sync/sbin/bin/sync shutdownx60shutdown/sbin/sbin/shutdown haltx70halt/sbin/sbin/halt mailx812mail/var/spool/mail/sbin/nologin operatorx110operator/root/sbin/nologin gamesx12100games/usr/games/sbin/nologin ftpx1450FTP User/var/ftp/sbin/nologin
col
col [-xb]
参数:
-x:将tab键转换成对等的空格键
-b:在文字内有反斜杠(\)时,仅保留反斜杠最后接的那个字符
//-A可显示所有特殊按键,^I便是tab键 [wuchao@localhost ~]$ cat -A ./.bashrc # .bashrc$ $ # Source global definitions$ if [ -f /etc/bashrc ]; then$ ^I. /etc/bashrc$ fi$ $ # Uncomment the following line if you don't like systemctl's auto-paging feature:$ # export SYSTEMD_PAGER=$ $ # User specific aliases and functions$ //将tab替换成空格 [wuchao@localhost ~]$ cat ./.bashrc | col -x | cat -A | more # .bashrc$ $ # Source global definitions$ if [ -f /etc/bashrc ]; then$ . /etc/bashrc$ fi$ $ # Uncomment the following line if you don't like systemctl's auto-paging feature:$ # export SYSTEMD_PAGER=$ $ # User specific aliases and functions$
[wuchao@localhost ~]$
join
将两个文件当中有相同数据的那一行加在一起
join [-ti12] file1 file2
参数:
-t:join默认以空格符分隔数据,并且对比第一个字段的数据,如果两个文件相同,则将两条数据连成一行,且第一个字段放在第一个
-i:忽略大小写
-1:代表第一个文件要用哪个字段来分析
-2:代表第二个文件要用哪个字段来分析
//查看两个文件前三行内容 [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:$6$vBW41vi8uts5DfMV$livdvlQNgxJGYHUPoO0NNgIoyZL8byHTpZu4x/wNJLzVB56n61gZX.VFz7qCuD36B7GOpgKWBGlAVzaK6iM/B0::0:99999:7::: bin:*:16659:0:99999:7::: daemon:*:16659:0:99999:7::: [root@localhost 桌面]# //使用“:”分隔,两个文件每行第一个字段相同的部分整合在一行,以“:”隔开,每行第一个为字段 [root@localhost 桌面]# join -t ':' /etc/passwd /etc/shadow root:x:0:0:root:/root:/bin/bash:$6$vBW41vi8uts5DfMV$livdvlQNgxJGYHUPoO0NNgIoyZL8byHTpZu4x/wNJLzVB56n61gZX.VFz7qCuD36B7GOpgKWBGlAVzaK6iM/B0::0:99999:7::: bin:x:1:1:bin:/bin:/sbin/nologin:*:16659:0:99999:7::: daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:16659:0:99999:7::: //当我们想把两个文件的不同字段作为同一字段比较时 [root@localhost 桌面]# join -t ':' -1 4 /etc/passwd -2 3 /etc/group
paste
直接将两个文件的对应行整合在一起
join [-d]
参数:
-d:后面接分隔符,默认为tab
-:如果file部分写成-,表示来自标准输入的数据的意思
[root@localhost 桌面]# paste -d '=' /etc/passwd /etc/shadow | head -n 3 root:x:0:0:root:/root:/bin/bash=root:$6$vBW41vi8uts5DfMV$livdvlQNgxJGYHUPoO0NNgIoyZL8byHTpZu4x/wNJLzVB56n61gZX.VFz7qCuD36B7GOpgKWBGlAVzaK6iM/B0::0:99999:7::: bin:x:1:1:bin:/bin:/sbin/nologin=bin:*:16659:0:99999:7::: daemon:x:2:2:daemon:/sbin:/sbin/nologin=daemon:*:16659:0:99999:7:::
expand
将tab键转成空格键
expand [-t] file
参数:
-t:定义转成几个空格键
切割命令:split
将大文件切割成多个小文件
split [-bl] file prefix
参数:
-b:切割的文件大小,比如200k,200b,200m
-l:以行数来切割
prefix:作为切割文件的前导文字
[root@localhost 桌面]# ls -l /etc/shadow ----------. 1 root root 1283 4月 25 13:33 /etc/shadow //按1k大小切割 [root@localhost 桌面]# split -b 1k /etc/shadow ~/shadow //查看切割的文件 [root@localhost 桌面]# ls -l ~/shadow* -rw-r--r--. 1 root root 1024 7月 15 14:39 /root/shadowaa -rw-r--r--. 1 root root 259 7月 15 14:39 /root/shadowab [root@localhost 桌面]# //整合切割的文件 [root@localhost 桌面]# cat ~/shadow* >> ~/shadow [root@localhost 桌面]# ls -l ~/shadow* -rw-r--r--. 1 root root 1283 7月 15 14:44 /root/shadow -rw-r--r--. 1 root root 1024 7月 15 14:39 /root/shadowaa -rw-r--r--. 1 root root 259 7月 15 14:39 /root/shadowab [root@localhost 桌面]#
参数代换:xargs
[root@localhost 桌面]# [root@localhost 桌面]# cut -d: -f1 < /etc/passwd | sort | xargs echo abrt adm avahi avahi-autoipd bin chrony colord daemon dbus ftp games gdm geoclue gnome-initial-setup halt libstoragemgmt lp mail nfsnobody nobody ntp operator polkitd postfix pulse qemu radvd root rpc rpcuser rtkit saslauth setroubleshoot shutdown sshd sssd sync systemd-bus-proxy systemd-network tcpdump tss unbound usbmuxd wuchao
关于“-”的用途
在管道命令中,经常需要前一个的stdout作为后一个的stdin,这是stdout和stdin用“-”来表示
//将home里面的文件打包,打包的数据传送到stdout,作为后面指令的stdin [root@localhost 桌面]# tar -cvf - /home | tar -xvf -