内容摘要:
一、shell特殊符_cut命令
二、sort_wc_uniq命令
uniq用于报告或忽略文件中的重复行,一般与sort命令结合使用。(只能去除相连的两行重复)
三、tee_tr_split命令
- 将小写al替换成大写AL,也可以替换成数字等。
- 命令split可以将一个大文件分割成很多个小文件,有时需要将文件分割成更小的片段,比如为提高可读性,生成日志等。
- 命令split -b 指定大小分隔文件。
- 命令split -l 指定行数分隔文件。
- 可以在命令最后 自定义文件的前缀。例:
四、shell特殊符号(下)
- $ 变量前缀,!$组合,正则里面表示行尾
- ;多条命令写到一行,用分号分割
- ~用户家目录,后面正则表达式表示匹配符
- &放到命令后面 会把命令丢到后台
- #>正确输出重定向, >>正确输出追加、 2>错误输出重定向、 2>>错误追加重定向、&>正确错误重定向。
- []指定字符中的一个,[0-9],[a-zA-Z],[abc]。
- || 和 &&,用于命令之间
- || 用于命令之间表示或,如果第一条命令执行正确,第二条命令则不执行。如果第一条命令执行错误,则执行第二条命令。
- && 用于命令之间,如果第一条命令执行成功了才执行第二条命令,如果第一条命令错误,第二条命令则不执行。
扩展:
- \d :代表日期,格式为weekday month date,例如:"Mon Aug 1"
- \H :完整的主机名称
- \h :仅取主机名中的第一个名字
- \t :显示时间为24小时格式,如:HH:MM:SS
- \T :显示时间为12小时格式
- \A :显示时间为24小时格式:HH:MM
- \u :当前用户的账号名称
- \v :BASH的版本信息
- \w :完整的工作目录名称
- \W :利用basename取得工作目录名称,只显示最后一个目录名
- \# :下达的第几个命令
- \$ :提示字符,如果是root用户,提示符为 # ,普通用户则为 $
- & 放在命令后会把命令丢到后台
- | 正则中表示或者。
- ||用于命令之间表示或,如果第一条命令执行正确,第二条命令则不执行。如果第一条命令执行错误,则执行第二条命令。
- && 用于命令之间,如果第一条命令执行成功了才执行第二条命令,如果第一条命令错误,第二条命令则不执行。
六、相关测验题目
1. 设置环境变量 HISTSIZE , 使其能够保存10000条命令历史。
答:修改/etc/profile,HISTSIZE=10000。
2. 为什么如果这样设置PS1 (PS1="[\u@\h \W]\$ ") 显示的结果和我们预想的不一样,那要如何设置才能恢复原来默认的?
答:默认的PS1内容为: '[\u@\h \W]\$ ' ,所以默认的提示符就是: [root@localhost ~]# 。使用双引号时需要用\对$脱义,PS1="[\\u@\\h \\W]\\$ "
3. 想办法把当前目录下的文件的文件名中的小写字母全部替换为大写字母。
答:find ./ -type f -name "*" |tr [a-z] [A-Z]
4. 使用sort以":"为分隔符,对/etc/passwd文件的第5段排序。
答:sort -t ':' -k 5 /etc/passwd
5. 使用cut以":"为分隔符,截出/etc/passwd的第三段字符。
6. 简述这几个文件的作用: /etc/profile, /etc/bashrc, .bashrc, .bash_profile.
答:/etc/profile——系统层次的变量文件,用户登录shell时才会调用、/etc/bashrc——系统层次的变量文件,登录系统时就会调用、.bashrc——用户层次的变量文件,登录系统时就会调用、.bash_profile——用户层次的变量文件,登录shell时才会调用。
答:export是声明变量的意思,让该shell的子shell也知道该变量的值是多少.如果export后面不加任何变量名,则它会声明所有的变量
答:a.设定变量的格式为 “a=b”, 其中a为变量名,b为变量的内容,等号两边不能有空格;
b.变量名只能由英、数字以及下划线组成,而且不能以数字开头;
c.当变量内容带有特殊字符(如空格)时,需要加上单引号脱义;
9. 如何把要运行的命令丢到后台跑?又如何把后台跑的进程给调到前台?
答:使用CTRL+z将命令暂停然后使用命令bg可以将命令调至后台运行,使用命令fg可以将命令调至前台(多个命令在后台运行时可以使用jobs查看命令的序列号,指定序列号调用相应的命令)
11. 如何把一个命令的输出内容不仅打印到屏幕上而且还可以重定向到一个文件内?
答:使用tee 命令可以将一个命令的输出内容不仅打印到屏幕上而且还可以重定向到一个文件。例:vmstat 1 5 |tee vmstat.txt
12. 假如有个命令很长,我们如何使用一个简单的字符串代替这个复杂的命令呢?请举例说明。
13. 我如何实现这样的功能,把一条命令丢到后台运行,而且把其正确输出和错误输出同时重定向到一个文件内?
答:可以使用&>符号将正确和错误输出重定向到一个文件内,并在命令后加上符号&,把该命令丢到后台。
14. 如何按照大小(假如按照10M)分隔一个大文件,又如何按照行数(假如10000行)分隔?
答:split -b 10M 1.txt split -l 10000 1.txt
答:符号;表示在一行内分别执行多个命令(互不相干),符号&&表示当前一个命令执行正确时才会执行第二个命令,符号||表示当前一个命令执行正确时不执行第二命令(错误则执行)
答:可以修改某个用户家目录下的变量配置文件,如:~/.bashrc 或~/.bash_profile
17. 使用哪个命令会把系统当中所有的变量以及当前用户定义的自定义变量列出来?
七、简易审计系统
- 有时候我们需要对线上用户操作记录进行历史记录待出现问题追究责任人,,但Linux系统自带的history命令用户有自行删除权限,那怎么设置可以让用户的操作记录实时记录,并保证普通用户无权删除呢?本文教你一招
- 创建目录:mkdir -p /usr/local/domob/records/
- 设置目录权限:chmod 777 /usr/local/domob/records/
- 设置防删除权限:chmod +t /usr/local/domob/records/
- 修改变量配置文件vi /etc/profile,在文件最后加入以下代码:
f [ ! -d /usr/local/domob/records/${LOGNAME} ]
mkdir -p /usr/local/domob/records/${LOGNAME}
chmod 300 /usr/local/domob/records/${LOGNAME}
export HISTORY_FILE="/usr/local/domob/records/${LOGNAME}/bash_history"
export PROMPT_COMMAND='{ date "+%Y-%m-%d %T ##### $(who am i |awk "{print \$1\" \"\$2\" \"\$5}") #### $(history 1 | { read x cmd; echo "$cmd"; })"; } >>$HISTORY_FILE'
八、扩展参考
- source exec 区别 http://alsww.blog.51cto.com/2001924/1113112
- 关于PROMPT_COMMAND环境变量的含义 http://www.linuxnote.org/prompt_command-environment-variables.html