23、grep/egrep正则表达式练习:
1) 显示/etc/passwd文件中不以bash结尾的行;
答:
# grep -v "bash$" /etc/passwd
2) 找出ifconfig命令执行结果中的两位或三位整数;
答:
# ifconfig | grep --color=auto "\<\([[:digit:]]\{2,3\}\)\>" //还有00
# ifconfig | grep --color=auto "\<\([1-9][0-9]\|[1-9][0-9][0-9]\)\>" //完美
3) 找出/etc/grub2.cfg(在CentOS6中是/etc/grub.conf)文件中,以空白字符开头的非空白行;
答:
# cat /etc/grub.conf | grep "^[[:space:]]\+.*[^[:space:]]$" //centos6
# grep "^[[:space]]\+[^[:space:]]\+" /etc/grub2.cfg //centos7
default=0
设定默认启动菜单项;整个菜单中的所有的title是从0开始编号的;
timeout=5
用户未作出选择时,grub会自动引导默认菜单对应的内核的超时时间;
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz
grub的背景图片对应的路径;
hiddenmenu
隐藏grub的启动菜单
password --md5 CRYPTED_PASSWORD
为了保护菜单设置的密码,通常用于防止随意进入单用户模式;
title CentOS 6 (2.6.32-573.el6.x86_64)
定义菜单项中的各个"标题",可以定义多个title项;至少有一项;
root (hd0,0)
指定grub的根设备,通常是用来安装grub的那个分区;
kernel /vmlinuz-2.6.32-573.el6.x86_64 ro root=UUID=5ebb0e76-bb19-4a80-9c70-0d101c0778e1 nomodeset rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
该菜单对应的要启动的内核及传递给内核的各个参数;
initrd /initramfs-2.6.32-573.el6.x86_64.img
内核所对应的ramdisk(ramfs)文件
password --md5 CRYPTED_PASSWORD
保护操作系统内核的启动;
4) 找出"netstat -tan”命令的结果中,以"LISTEN"后跟任意个空白字符结尾的行;
答:
# netstat -tan | grep ".*LISTEN[[:space:]]*$"
# netstat -tan | grep "LISTEN[[:space:]]*$"
5) 找出"fdisk -l"命令的结果中,包含以/dev/后跟sd或hd及一个小写字母的行;
答:
# fdisk -l | grep "^/dev/[s|h]d[a-z]"
6) 找出"ldd /usr/bin/vim"命令的结果中所有的文件路径;
答:
# ldd /usr/bin/vim | grep -o "/[^[:space:]]\+"
# ldd /usr/bin/vim | grep -o "/.*/.*"
7) 找出/proc/meminfo文件中,所有以大写S或小写s开头的行,你有多少种方法实现该任务?
答:
# cat /proc//meminfo | grep "^[Ss].*" //内存使用情况
# cat /proc//meminfo | grep -E "^(S|s).*"
# cat /proc//meminfo | grep -i "^s" //忽略大小写
# cat /proc/meminfo | grep "^s\|^S" //注意解释输出“或”
# cat /proc/meminfo | grep -e "^s" -e "^S" //多项匹配
8) 使用egrep取出某个路径的基名;
答:
# ls /usr/bin/ldd | grep -o "/[a-z]\+$"
9) 显示出ifconfig命令结果中的0-255之间的整数;
答:
# ifconfig | grep --color=auto "\<\([0-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\>"
10) 添加用户bash, testbash, basher, nologin, unlogin, logining,要求前三个用户的默认shell为/bin/bash,后三个用户的默认shell为/sbin/nologin,而后找出其用户名与shell名相同的用户信息;
答:
# useradd -s /bin/bash bash
# useradd -s /bin/bash basher
# useradd -s /bin/bash testbash
# useradd -s /sbin/nologin nologin
# useradd -s /sbin/nologin unlogin
# useradd -s /sbin/nologin logining //创建多用户可用脚本来完成
# cat /etc/passwd | grep "^\<\([[:alnum:]]\+\)\>.*\1$"
例:
[root@little ~]# grep -v "bash$" /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
……
[root@little ~]# ifconfig | grep --color=auto "\<\([[:digit:]]\{2,3\}\)\>"
eth0 Link encap:Ethernet HWaddr 00:0C:29:EF:91:5E
inet addr:172.16.67.2 Bcast:172.16.255.255 Mask:255.255.0.0
inet6 addr: fe80::20c:29ff:feef:915e/64 Scope:Link
RX bytes:638912 (623.9 KiB) TX bytes:587812 (574.0 KiB)
eth1 Link encap:Ethernet HWaddr 00:0C:29:EF:91:68
inet addr:192.168.222.136 Bcast:192.168.222.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:feef:9168/64 Scope:Link
TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
RX bytes:112446 (109.8 KiB) TX bytes:1334 (1.3 KiB)
eth2 Link encap:Ethernet HWaddr 00:0C:29:EF:91:72
inet addr:192.168.222.137 Bcast:192.168.222.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:feef:9172/64 Scope:Link
TX packets:175 errors:0 dropped:0 overruns:0 carrier:0
RX bytes:120635 (117.8 KiB) TX bytes:17648 (17.2 KiB)
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
RX packets:46 errors:0 dropped:0 overruns:0 frame:0
TX packets:46 errors:0 dropped:0 overruns:0 carrier:0
[root@little ~]#
[root@little ~]# cat /etc/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/sda2
# initrd /initrd-[generic-]version.img
#boot=/dev/sda1
default=0
timeout=5
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-573.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-573.el6.x86_64 ro root=UUID=1e8379ed-1b71-4c70-b97a-4d2121654719 nomodeset rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-573.el6.x86_64.img
[root@little ~]#
[root@little ~]# cat /etc/grub.conf | grep "^[[:space:]]\+.*[^[:space:]]$"
root (hd0,0)
kernel /vmlinuz-2.6.32-573.el6.x86_64 ro root=UUID=1e8379ed-1b71-4c70-b97a-4d2121654719 nomodeset rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-573.el6.x86_64.img
[root@little ~]#
[root@little ~]# netstat -tan | grep ".*LISTEN[[:space:]]*$"
tcp 0 0 0.0.0.0:36239 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN
tcp 0 0 :::111 :::* LISTEN
tcp 0 0 :::80 :::* LISTEN
tcp 0 0 :::33813 :::* LISTEN
tcp 0 0 :::22 :::* LISTEN
tcp 0 0 ::1:631 :::* LISTEN
tcp 0 0 ::1:25 :::* LISTEN
tcp 0 0 ::1:6010 :::* LISTEN
[root@little ~]#
[root@little ~]# fdisk -l | grep "^/dev/[s|h]d[a-z]"
/dev/sda1 * 1 26 204800 83 Linux
/dev/sda2 26 6553 52428800 83 Linux
/dev/sda3 6553 6814 2097152 82 Linux swap / Solaris
[root@little ~]#
[root@little ~]# ldd /usr/bin/vim | grep -o "/.*/.*"
/lib64/libm.so.6 (0x0000003634800000)
/lib64/libselinux.so.1 (0x0000003635400000)
/lib64/libtinfo.so.5 (0x000000363d000000)
/lib64/libacl.so.1 (0x0000003c76800000)
/usr/lib64/libgpm.so.2 (0x0000003634c00000)
/usr/lib64/perl5/CORE/libperl.so (0x0000003634400000)
/lib64/libdl.so.2 (0x0000003633800000)
/lib64/libpthread.so.0 (0x0000003634000000)
/lib64/libc.so.6 (0x0000003633c00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003633400000)
/lib64/libattr.so.1 (0x0000003643800000)
/lib64/libresolv.so.2 (0x0000003635800000)
/lib64/libnsl.so.1 (0x0000003644c00000)
/lib64/libcrypt.so.1 (0x000000363f800000)
/lib64/libutil.so.1 (0x0000003643c00000)
/lib64/libfreebl3.so (0x000000363f400000)
[root@little ~]#
[root@little ~]# ldd /usr/bin/vim | grep -o "/[^[:space:]]\+"
/lib64/libm.so.6
/lib64/libselinux.so.1
/lib64/libtinfo.so.5
/lib64/libacl.so.1
/usr/lib64/libgpm.so.2
/usr/lib64/perl5/CORE/libperl.so
/lib64/libdl.so.2
/lib64/libpthread.so.0
/lib64/libc.so.6
/lib64/ld-linux-x86-64.so.2
/lib64/libattr.so.1
/lib64/libresolv.so.2
/lib64/libnsl.so.1
/lib64/libcrypt.so.1
/lib64/libutil.so.1
/lib64/libfreebl3.so
[root@little ~]#
[root@little ~]# ldd /usr/bin/vim | grep -o "/[^[:space:]]\+" | wc -l
16
[root@little ~]# ldd /usr/bin/vim | grep -o "/.*/.*" | wc -l
16
[root@little ~]# cat /proc//meminfo | grep "^[S|s].*"
SwapCached: 48 kB
SwapTotal: 2097148 kB
SwapFree: 2094960 kB
Shmem: 3136 kB
Slab: 85056 kB
SReclaimable: 15576 kB
SUnreclaim: 69480 kB
[root@little ~]# ls /usr/bin/ldd | grep -o "/[a-z]\+$"
/ldd
[root@little ~]#
[root@little ~]# ifconfig | grep --color=auto "\<\([0-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\>"
[root@little ~]#
[root@little ~]# cat /etc/passwd | grep "^\<\([[:alnum:]]\+\)\>.*\1$"
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
[root@little ~]#
24.脚本练习:
1) 编写一个脚本,要求:
统计/etc, /var, /usr目录中所有非隐藏的一级子目录和文件的数量总和;
答:
#!/bin/bash
#
a=$(ls /etc | wc -l)
b=$(ls /var | wc -l)
c=$(ls /usr | wc -l)
count=$[$a+$b+$c]
echo "$count"
[root@little ~]# vi 24p1.sh
[root@little ~]#
[root@little ~]# chmod +x 24p1.sh
[root@little ~]#
[root@little ~]# ./24p1.sh
303
2) 编写一个脚本,要求:
对于目录/tmp/testdir1,如果当前有效用户有读、写和执行的权限,那么就在该目录中创建一个文件;否则,显示“没有权限不能创建文件”的信息。
答:
#!/bin/bash
#
FPATH=/tmp/testdir1
[ -r $FPATH -a -w $FPATH -a -x $FPATH ] && touch $FPATH/newdir || echo "Don't right to create useradd"
[root@little ~]# vi 24p2.sh
[root@little ~]#
[root@little ~]# ll /tmp/testdir1
total 0
[root@little ~]# chmod +x 24p
24p1.sh 24p2.sh
[root@little ~]# chmod +x 24p2.sh
[root@little ~]#
[root@little ~]# ./24p2.sh
[root@little ~]#
[root@little ~]# ll /tmp/testdir1
total 0
-rw-r--r--. 1 root root 0 Nov 21 11:29 newdir
[root@little ~]#
3) 编写一个脚本,要求:
从/etc/passwd中UID和GID相同的用户中随机选择一个用户,判断其用户名和基本组名是否相同;
答:
#!/bin/bash
#
username=$(grep "\<\([[:digit:]]\+\).*\1\>" /etc/passwd | sort -R | head -1 | cut -d":" -f1)
groupname=$(id -gn $username)
[ $username == $groupname ] && echo "username and group is same." || "username and groupname is different."
[root@little ~]# vi 24p3.sh
[root@little ~]#
[root@little ~]# chmod +x 24p3.sh
[root@little ~]#
[root@little ~]# ./24p3.sh
cut: invalid option -- '1'
Try `cut --help' for more information.
./24p3.sh: line 5: [: ==: unary operator expected
./24p3.sh: line 5: username and groupname is different.: command not found
[root@little ~]#
[root@little ~]# vi +5 24p3.sh
[root@little ~]#
[root@little ~]# ./24p3.sh
username and group is same.
[root@little ~]#