shell学习训练&&总结_7
1.统计班级学生各科成绩(shuxue,yuwen,yinyu)信息,并计算各科成绩的平均值和总和
#!/bin/bash
#本操作实现数组存储,学生和成绩。按q键退出
t=0
while true;do
read -p"input student name:" st
if [[ $st != q ]];then
student[$t]=$st
else
break
fi
read -p"input math scores:" s1
if [[ $s1 != q ]];then
shuxue[$t]=$s1
else
echo ${zongjie[@]}
break
fi
read -p"input yuwen scores:" s2
if [[ $s2 != q ]];then
yuwen[$t]=$2
else
echo ${zongjie[@]}
break
fi
read -p"input yinyu scores:" s3
if [[ $s3 != q ]];then
yinyu[$t]=$s3
else
echo ${zongjie[@]}
break
fi
echo "student:${student[$t]} math scores:${shuxue[$t]} yuwen scores:${yuwen[$t]} yinyu scores:${yinyu[$t]}"
let t++
done
2.正则案例分析
datafile内容如下
Steve Blenheim:238-923-7366:95 Latham Lane, Easton, PA 83755:11/12/56:20300
Betty Boop:245-836-8357:635 Cutesy Lane, Hollywood, CA 91464:6/23/23:14500
Igor Chevsky:385-375-8395:3567 Populus Place, Caldwell, NJ 23875:6/18/68:23400
Norma Corder:397-857-2735:74 Pine Street, Dearborn, MI 23874:3/28/45:245700
Jennifer Cowan:548-834-2348:583 Laurel Ave., Kingsville, TX 83745:10/1/35:58900
Jon DeLoach:408-253-3122:123 Park St., San Jose, CA 04086:7/25/53:85100
Karen Evich:284-758-2857:23 Edgecliff Place, Lincoln, NB 92086:7/25/53:85100
Karen Evich:284-758-2867:23 Edgecliff Place, Lincoln, NB 92743:11/3/35:58200
Karen Evich:284-758-2867:23 Edgecliff Place, Lincoln, NB 92743:11/3/35:58200
Fred Fardbarkle:674-843-1385:20 Parak Lane, DeLuth, MN 23850:4/12/23:780900
Fred Fardbarkle:674-843-1385:20 Parak Lane, DeLuth, MN 23850:4/12/23:780900
Lori Gortz:327-832-5728:3465 Mirlo Street, Peabody, MA 34756:10/2/65:35200
Paco Gutierrez:835-365-1284:454 Easy Street, Decatur, IL 75732:2/28/53:123500
Ephram Hardy:293-259-5395:235 CarltonLane, Joliet, IL 73858:8/12/20:56700
James Ikeda:834-938-8376:23445 Aster Ave., Allentown, NJ 83745:12/1/38:45000
Barbara Kertz:385-573-8326:832 Ponce Drive, Gary, IN 83756:12/1/46:268500
Lesley Kirstin:408-456-1234:4 Harvard Square, Boston, MA 02133:4/22/62:52600
William Kopf:846-836-2837:6937 Ware Road, Milton, PA 93756:9/21/46:43500
Sir Lancelot:837-835-8257:474 Camelot Boulevard, Bath, WY 28356:5/13/69:24500
Jesse Neal:408-233-8971:45 Rose Terrace, San Francisco, CA 92303:2/3/36:25000
Zippy Pinhead:834-823-8319:2356 Bizarro Ave., Farmount, IL 84357:1/1/67:89500
Arthur Putie:923-835-8745:23 Wimp Lane, Kensington, DL 38758:8/31/69:126000
Popeye Sailor:156-454-3322:945 Bluto Street, Anywhere, USA 29358:3/19/35:22350
Jose Santiago:385-898-8357:38 Fife Way, Abilene, TX 39673:1/5/58:95600
Tommy Savage:408-724-0140:1222 Oxbow Court, Sunnyvale, CA 94087:5/19/66:34200
Yukio Takeshida:387-827-1095:13 Uno Lane, Ashville, NC 23556:7/1/29:57000
Vinh Tranh:438-910-7449:8235 Maple Street, Wilmington, VM 29085:9/23/63:68900
file
48 Dec 3BC1977 LPSX 68.00 LVX2A 138
483 Sept 5AP1996 USP 65.00 LVX2C 189
47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
219 dec 2CC1999 CAD 23.00 PLV2C 68
484 nov 7PL1996 CAD 49.00 PLV2C 234
483 may 5PA1998 USP 37.00 KVM9D 644
216 sept 3ZL1998 USP 86.00 KVM9E 234
Question2:
1、显示/etc/passwd文件中以bash结尾的行;
egrep "bash$" /etc/passwd
2、找出/etc/passwd文件中的三位或四位数;
egrep "([0-9]){3,4}" /etc/passwd
#{}引用符
#[]引用字符,若引用123则格式:[1][2][3];若引用1或2或3则格式:[1]|[2]|[3]
3、找出/etc/grub2.cfg文件中,以至少一个空白字符开头,后面又跟了非空白字符的行
egrep "^ {1,}[^ ].*" /etc/grub2.cfg
4、找出"netstat -tan”命令的结果中,以‘LISTEN’后跟0或多个空白字符结尾的行;
netstat -tan|egrep "LISTEN[0]$|LISTEN +"
#或者
netstat -tan|egrep "LISTEN[0]$|LISTEN[[:space:]]+"
# +的意思为将前面相邻的字符至少匹配一次,相当于{1,}。
#[[:space:]]在正则中可以直接用空格代替。
5、找出"fdisk -l“命令的结果中,包含以/dev/后跟sd或hd及一个字母的行;
fdisk -l | egrep '/dev/(s|h)d[a-z]'
或者
fdisk -l | egrep '/dev/[hs]d[a-z]'
# []表示匹配中括号内的任一字符
6、找出”ldd /usr/bin/cat“命令的结果中文件路径;
ldd /usr/bin/cat|egrep -o "/.*"
7、找出/proc/meminfo文件中,所有以大写或小写s开头的行;至少用三种方式实现;
#1
egrep "^[sS]" /proc/meminfo
#2
egrep "^(s|S)" /proc/meminfo
#3
cat /proc/meminfo|egrep "^[sS]"
8、显示当前系统上root、centos或spark用户的相关信息;
egrep "(root|centos|spark)" /etc/passwd
9、echo输出一个绝对路径,使用egrep取出其基名;
echo /etc/passwd/world|egrep "[^/]+/?$"
#[^/]
#?:最多匹配一次,相当于{,1}
#/?$:意思是,匹配绝对路径最后1个或1个以下/的路径
10、找出ifconfig命令结果中的1-255之间的整数;
ifconfig |egrep -o "\<25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]\>"
11、找出系统中其用户名与shell名相同的用户。
egrep "^(.*):.*\1$" /etc/passwd
Question3:
1、显示/etc/rc.d/rc.sysinit文件中以不区分大小的h开头的行;
egrep ^[hH] /etc/passwd
2、显示/etc/passwd中以sh结尾的行;
egrep "sh$" /etc/passwd
3、显示/etc/fstab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行;
egrep "^# + {1,}.*" /etc/passwd
#或者
egrep "^#[[:space:]]+[[:space:]]{1,}.*" /etc/passwd
4、查找/etc/rc.d/rc.local中包含“以to开始并以to结尾”的字串行;
egrep "^(to).*\1" /etc/rc.d/rc.local
5、查找/etc/inittab中含有“以s开头,并以d结尾的单词”模式的行;(ps:用“\<word\>”
或"\bworld\b"
匹配字符)
egrep "\<s.*d$\>" /etc/inittab
6、查找ifconfig命令结果中的1-255之间的整数;
ip a |egrep -o "\<25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]\>"
7、显示/var/log/secure文件中包含“Failed”或“FAILED”的行
egrep "Faild|FAILED" /var/log/secure
8、在/etc/passwd中取出默认shell为bash
egrep "^(.*).*\1$" /etc/passwd
9、以长格式列出/etc/目录下以ns开头、.conf结尾的文件信息
egrep "^(ns).*\.(conf)$" /etc
10、高亮显示passwd文件中冒号,及其两侧的字符
egrep "[^:]" /etc/passwd
11、匹配/etc/services中开头结尾字母一样的单词
egrep "\<(.)[a-zA-Z]*\1\>" /etc/services