2018年8月16日第十一节课笔记——shell基础(下)

内容摘要:

  • shell特殊符_cut命令
  • sort_wc_uniq命令
  • tee_tr_split命令
  • shell特殊符号(下)
  • 课堂笔记
  • 相关测验题目
  • 简易审计系统

一、shell特殊符_cut命令

  • 特殊字符,如图

  • *匹配任意内容
  • ?匹配任意一个内容
  • [] 匹配中括号中的一个字符
  • #注释字符
  • \ 脱义字符
  • | 管道符

  • 命令cut可以截取指定的文本,-d选项“”内指定分隔符号,-f指定段数,多段用逗号分隔。

示例:

  • 命令cut -c  截取第几个字符,例:cat /etc/passwd |head -2 |cut -c 1,2,3,4  截取前四个字符串。

二、sort_wc_uniq命令

sort 为一个文本排序(默认ascii编码排序)

  • 命令sort -n 会以数字大小排序(字母和特殊符号记为0)。
  • 命令sort -r 反向排序与-n选项相反。

wc 计算文件的Byte数、字数或是列数

  • 命令wc -l 统计行数。
  • 命令wc -m 显示包括隐藏字符在内的字符数(包括“$"隐藏的换行符)。
  • 命令wc -w 显示文本的词的数量。(以空白符为分隔符)

uniq用于报告或忽略文件中的重复行,一般与sort命令结合使用。(只能去除相连的两行重复)

  • 命令uniq -c  去重并统计重复数
  • 命令sort 文本 |uniq   排序后去重。

三、tee_tr_split命令

  • 命令tee输出重定向并显示输出内容。
  • 命令tee 输出重定向并显示内容
  • 命令tee -a  追加重定向。
  • 命令tr 可以将一组字符变成另一组字符

  • 将小写al替换成大写AL,也可以替换成数字等。
  • 命令split可以将一个大文件分割成很多个小文件,有时需要将文件分割成更小的片段,比如为提高可读性,生成日志等。
  • 命令split -b 指定大小分隔文件。
  • 命令split -l 指定行数分隔文件。
  • 可以在命令最后 自定义文件的前缀。例:

四、shell特殊符号(下)

  • $ 变量前缀,!$组合,正则里面表示行尾
  • ;多条命令写到一行,用分号分割
  • ~用户家目录,后面正则表达式表示匹配符
  • &放到命令后面 会把命令丢到后台
  • #>正确输出重定向, >>正确输出追加、 2>错误输出重定向、 2>>错误追加重定向、&>正确错误重定向。
  • []指定字符中的一个,[0-9],[a-zA-Z],[abc]。
  • || 和 &&,用于命令之间
  • || 用于命令之间表示或,如果第一条命令执行正确,第二条命令则不执行。如果第一条命令执行错误,则执行第二条命令。
  • && 用于命令之间,如果第一条命令执行成功了才执行第二条命令,如果第一条命令错误,第二条命令则不执行。

课堂笔记及扩展:

五、课堂笔记

  • 过滤这个文件的非空行和非注释行:egrep -v “^#|^$" 1.txt   
  • 命令source 加载系统变量文件或者自定义的变量文件,使变量立即生效。
  • PS1变量的常用参数以及含义:
  1. \d :代表日期,格式为weekday month date,例如:"Mon Aug 1"
  2. \H :完整的主机名称
  3. \h :仅取主机名中的第一个名字
  4. \t :显示时间为24小时格式,如:HH:MM:SS
  5. \T :显示时间为12小时格式
  6. \A :显示时间为24小时格式:HH:MM
  7. \u :当前用户的账号名称
  8. \v :BASH的版本信息
  9. \w :完整的工作目录名称
  10. \W :利用basename取得工作目录名称,只显示最后一个目录名
  11. \# :下达的第几个命令
  12. \$ :提示字符,如果是root用户,提示符为 # ,普通用户则为 $
  • & | || && 四个符号的区别:
  1. & 放在命令后会把命令丢到后台
  2. | 正则中表示或者。
  3. ||用于命令之间表示或,如果第一条命令执行正确,第二条命令则不执行。如果第一条命令执行错误,则执行第二条命令。
  4. && 用于命令之间,如果第一条命令执行成功了才执行第二条命令,如果第一条命令错误,第二条命令则不执行。
  • 命令sort将文件进行排序,并将排序结果标准输出:

  1. 选项-t 指定分隔符
  2. 选项-k 指定以第几段排序
  3. 选项-n指定数字从小到大顺序排列

六、相关测验题目

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的第三段字符。

答:cut -d ':' -f 3 /etc/passwd

6. 简述这几个文件的作用: /etc/profile, /etc/bashrc, .bashrc, .bash_profile.

答:/etc/profile——系统层次的变量文件,用户登录shell时才会调用、/etc/bashrc——系统层次的变量文件,登录系统时就会调用、.bashrc——用户层次的变量文件,登录系统时就会调用、.bash_profile——用户层次的变量文件,登录shell时才会调用。

7. export 的作用是什么?

答:export是声明变量的意思,让该shell的子shell也知道该变量的值是多少.如果export后面不加任何变量名,则它会声明所有的变量

8. linux下自定义变量要符合什么样的规则呢?  

答:a.设定变量的格式为 “a=b”, 其中a为变量名,b为变量的内容,等号两边不能有空格;

       b.变量名只能由英、数字以及下划线组成,而且不能以数字开头;

       c.当变量内容带有特殊字符(如空格)时,需要加上单引号脱义;

9. 如何把要运行的命令丢到后台跑?又如何把后台跑的进程给调到前台?

答:使用CTRL+z将命令暂停然后使用命令bg可以将命令调至后台运行,使用命令fg可以将命令调至前台(多个命令在后台运行时可以使用jobs查看命令的序列号,指定序列号调用相应的命令)

10.  列出当前目录下以"test"开头的文件和目录。

答:find ./ -name "test*"

11.  如何把一个命令的输出内容不仅打印到屏幕上而且还可以重定向到一个文件内?

答:使用tee 命令可以将一个命令的输出内容不仅打印到屏幕上而且还可以重定向到一个文件。例:vmstat 1 5 |tee vmstat.txt

12. 假如有个命令很长,我们如何使用一个简单的字符串代替这个复杂的命令呢?请举例说明。

答:设置别名  alias  aa=“命令”   即可

13. 我如何实现这样的功能,把一条命令丢到后台运行,而且把其正确输出和错误输出同时重定向到一个文件内?

答:可以使用&>符号将正确和错误输出重定向到一个文件内,并在命令后加上符号&,把该命令丢到后台。

14. 如何按照大小(假如按照10M)分隔一个大文件,又如何按照行数(假如10000行)分隔?

答:split -b 10M 1.txt      split -l 10000 1.txt

15. 做实验,搞明白 ; && || 这三个符号的含义。

答:符号;表示在一行内分别执行多个命令(互不相干),符号&&表示当前一个命令执行正确时才会执行第二个命令,符号||表示当前一个命令执行正确时不执行第二命令(错误则执行)

16. 如果只想让某个用户使用某个变量如何做?

答:可以修改某个用户家目录下的变量配置文件,如:~/.bashrc 或~/.bash_profile

17. 使用哪个命令会把系统当中所有的变量以及当前用户定义的自定义变量列出来?

答:set命令可以

七、简易审计系统

  • 有时候我们需要对线上用户操作记录进行历史记录待出现问题追究责任人,,但Linux系统自带的history命令用户有自行删除权限,那怎么设置可以让用户的操作记录实时记录,并保证普通用户无权删除呢?本文教你一招
  1. 创建目录:mkdir -p /usr/local/domob/records/
  2. 设置目录权限:chmod 777 /usr/local/domob/records/
  3. 设置防删除权限:chmod +t /usr/local/domob/records/
  4. 修改变量配置文件vi /etc/profile,在文件最后加入以下代码:

f [ ! -d  /usr/local/domob/records/${LOGNAME} ]

 

then

 

mkdir -p /usr/local/domob/records/${LOGNAME}

 

chmod 300 /usr/local/domob/records/${LOGNAME}

 

fi

 

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'

八、扩展参考

猜你喜欢

转载自blog.csdn.net/CN_SHzhaoyujie/article/details/81783297
今日推荐