马哥Linux培训课后作业(3)

2017-11-22|Categories: Magedu-training|

第1部分:用grep命令配合正则表达式完成

显示三个用户root、mage、wang的UID和默认shell

[root@centos7 ~] cut -d: -f1,3,7 /etc/passwd | grep 'root\|mage\|wang'
root:0:/bin/bash
mage:1004:/bin/bash
wang:1005:/bin/bash

找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行

# 注意:在tee >(commands)语句中,`>()`叫做进程替换,`>(`之间不能有空格,否则会报错
[root@centos7 ~] grep -o '^[[:alpha:]_]\+[[:blank:]]*([[:blank:]]*)' /etc/rc.d/init.d/functions | tee >(echo -e "\n`wc -l` matched.")
systemctl_redirect ()
checkpid()
__kill_pids_term_kill_checkpids()
__kill_pids_term_kill()
__pids_var_run()
__pids_pidof()
daemon()
killproc()
pidfileofproc()
pidofproc()
status()
echo_success()
echo_failure()
echo_passed()
echo_warning()
update_boot_stage()
success()
failure()
passed()
warning()
action()
strstr()
is_ignored_file()
is_true()
is_false()
apply_sysctl()

26 matched.

上面这个命令执行后,最后一行输出可能会显示到新的命令提示符后面:

output-out-of-orde

为什么会这样?因为Bash不会等待在进程替换中执行的命令:

that's because bash (contrary to zsh) doesn't wait for commands started in process substitution causing this kind of problem.

https://unix.stackexchange.com/a/405970/165450

使用egrep取出/etc/rc.d/init.d/functions基名(basename)

[testuser@centos7 ~]$ echo '/etc/rc.d/init.d/functions' | egrep -o '[^/]+/?$'
functions

使用egrep取出上面路径的目录名(dirname)

[testuser@centos7 ~]$ echo '/etc/rc.d/init.d/functions' | egrep -o '^/.*/'
/etc/rc.d/init.d/
# 假设路径时`/etc/rc.d/init.d/`,如何匹配`/etc/rc.d/`?

统计last命令中以root登录的每个主机IP地址登录次数

# 仅仅是给出一个目前我能提供的解决方案
[testuser@centos7 ~]$ last | grep root | awk '{print $1,$3}' | sort -k2 -nr | uniq -c
      8 root    172.18.1.72
      1 root    :1
     16 root    :0

利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255

# 0-9
[testuser@centos7 ~]$ seq 0 9 | egrep [0-9]

# 10-99
[testuser@centos7 ~]$ seq 9 100 | egrep "^[1-9][0-9]$"

# 100-199
[testuser@centos7 ~]$ seq 99 200 | egrep "^1[0-9]{2}$"

# 200-249
[testuser@centos7 ~]$ seq 199 250 | egrep "^2[0-4][0-9]$"

# 250-255
[testuser@centos7 ~]$ seq 249 256 | egrep "^25[0-5]$"

显示ifconfig命令结果中所有IPv4地址

[testuser@centos7 ~]$ ifconfig | egrep "\b((2[0-4][0-9]|25[0-5]|[01]?[0-9]{1,2})\.){3}(2[0-4][0-9]|25[0-5]|[01]?[0-9]{1,2})\b"

将此字符串:welcome to magedu linux 中的每个字符去重并排序,重复次数多的排到前面

[testuser@centos7 ~]$ echo 'welcome to magedu linux' | grep -o [[:alpha:]] | sort | uniq -c | sort -nr

用正则表达式表示出QQ号

# 根据百度百科查询结果,QQ号最短5位,最长11位
[1-9][0-9]{4,10}

用正则表达式表示出身份证号

# 18位数字组合的方式是:
# 地址码(6位)指的是公民常住户口所在县(市、镇、区)的行政区划代码,如110102是北京市西城区。
## http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201703/t20170310_1471429.html
# 出生日期码表示公民出生的公历年(4位)、月(2位)、日(2位)。
# 顺序码(3位)是给同地址码同出生日期码的人编定的顺序号,其中奇数分配给男性,偶数分配给女性。
# 最后(1位)是校验码,如果最后采用校验码系统计算的校验码是“10”,碍于身份证号码为18位的规定,则以“X”代替校验码“10”。
([1-8][0-9]{5})([12]9[0-9]{2})(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])([0-9]{3})([0-9]|X)

用正则表达式表示手机号

1[0-9]{10}

用正则表达式表示邮箱:x@y.z.m

[[:alnum:]\.\-\_]+@(([[:alnum:]])+\.){1,2}[[:alpha:]]{3}

第2部分:用vim命令配合正则表达式完成

复制/etc/profile至/tmp/目录,用查找替换命令删除/tmp/profile文件中的行首的空白字符

:%s/^ *//gc

复制/etc/rc.d/init.d/functions文件至/tmp目录,用查找替换命令为/tmp/functions的每行开头为空白字符的行的行首添加一个#号

:%s/\(^ \|^$\)/#/gc

Leave A Comment