- 论坛徽章:
- 93
|
终于糊弄出来了,重在参与,重在参与,没想到都这么多页了,真热闹啊。
第一题:- awk -F ' '
- awk -F '[ ]'
- awk -F '[ ]+'
- 三者有区别么?
复制代码 解:有。
- awk -F ' ' # 这句以任意空白符号为隔符,比如 tab 也可以匹配
- awk -F '[ ]' # 这句以固定一个空格为隔符,tab 不可以匹配
- awk -F '[ ]+' # 这句以一个或多个空格为隔符,tab 不可以匹配
复制代码 第二题:
- awk '/foo1/,/foo2/'
- sed -n '/foo1/,/foo2/p'
- 实现的功能一样么?
复制代码 解:一样,都是输出包含模式foo1和foo2之间的所有行
第三题:
- 如何用最简单的方法列举出 "a b c e f" 和"1 2 3" 的所有组合?
复制代码 解:这题没看的明白,是分别一个 abcef 这五个字母的组合,和 123 这三个数字的组合;还是 abcef 和 123 这五个字母和三个数字的组合?不过我觉得可能还是 a b c e f 分别取出一个字母和 1 2 3 分别取出一个数字的组合吧?
那就这样研究研究:
- [seesea2517@UC]$ echo {a,b,c,e,f}{1,2,3}
- a1 a2 a3 b1 b2 b3 c1 c2 c3 d1 d2 d3 e1 e2 e3 f1 f2 f3
复制代码 第四题:
- 字符串 'aaabcccaaabbbccc',去重复后,变为 'aaabcccbbb' , awk或sed实现,不使用管道。
复制代码 解:去重复后为啥bbb没去掉……真是头疼的事情。echo 后的 | 不算在限制中吧,不然用文件罗。
- [seesea2517@UC]$ echo "aaabcccaaabbbccc" | sed -r ':a; s/(.*)(.)(\2\2)(.*)\2\3(.*)/\1\2\3\4\5/; ta'
- aaabcccbbb
复制代码 第五题: 既然双引号中的\<newline>是续行符,为什么结果不是"foo barabc def"?
解:题目中的\<newline>已经是变量内容中的一个字符了,只是与续行符“长的一样”,并没有续行的功能
第六题:foo也bar之间为什么只有一个空格?
解:没有加引号,则空格做为 echo 的参数分隔,任意个空格都相当于一个空格。输入以“一个空格”为分隔符:
引自 info echo:
'echo' writes each given STRING to standard output, with a space between each and a newline after the last one.
第七题:
- $ cat file
- 1
- 2
- a
- b
- c
- d
- c
- e
- 如何取到 a ~ c 之间的所有行:
- a
- b
- c
- d
- c
复制代码 解:
- [seesea2517@UC]$ sed -n 'H;${g;s/\n/,/g;s/^[^a]*a/a/;s/c[^c]*$/c/;s/,/\n/g;p}' file
- a
- b
- c
- d
- c
复制代码 或
- [seesea2517@UC]$ cat test.awk
- /a/ {if(la==0) la=NR}
- /c/ {lc=NR}
- END{
- i=0
- while (getline ln < FILENAME > 0)
- {
- ++i
- if (i < la || i >lc)
- continue
- print ln
- }
- }
- [seesea2517@UC]$ awk -f test.awk file
- a
- 2
- a
- b
- c
- d
- c
复制代码 第八题:
- $ seq 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 如果得到以下结果:
- 1 2 3
- 2 3 4
- 3 4 5
- 4 5 6
- 5 6 7
- 6 7 8
- 7 8 9
- 8 9
复制代码 解:总觉得应该用 xargs,没搞定……
就来一个挫的吧:
- seq 8 | awk '{print $1, ($1+1>=10 ? "" : $1+1), ($1+2>=10 ? "" : $1+2)}'
复制代码 第九题:
- 有一千台机器client0001、 client0002、......、client1000需要定期修改oracle这个用户的密码,另外一台机器server0000分别与它们建立了 ssh信任关系。请在server0000上用shell脚本生成一个随机字符串,然后批量连接这一千台机器并修改oracle用户的密码,这些 client机器统一使用前面生成的字符串作为新密码。密码的复杂度要求是:8位长度,至少1位小写字母,至少1位大写字母,至少1为数字。最后生成一份统计信息,记录哪些机器修改成功,哪些机器修改失败,并记录新的密码。
复制代码 解:
文件一:change_pwd.sh文件二:auto_passwd.exp
- #!/usr/bin/expect
- # auto_passwd.exp
- # 自动更改密码
- # 创建者:seesea2517
- # 2012-03-12
- # 使用 expect 自动响应 passwd 来更改远程主机密码
- # 输入参数:
- # 参数一:登录用户名
- # 参数二:主机IP/或主机名
- proc auto_passwd {in_user in_ip in_port in_psw} {
- set timeout 180
- spawn ssh $in_user@$in_ip -p $in_port "passwd"
- expect {
- -nocase "password:"
- {
- send "$in_psw\r"
- exp_continue
- }
- "successfully."
- {
- return 0
- }
- timeout
- {
- return -1
- }
- }
- }
- set in_user [lindex $argv 0]
- set in_ip [lindex $argv 1]
- set in_port [lindex $argv 2]
- set in_psw [lindex $argv 3]
- set ret [auto_passwd $in_user $in_ip $in_port $in_psw]
- exit $ret
复制代码 文件三(用于测试):xx.sh
- #!/bin/bash
- exit $((RANDOM % 3))
复制代码 第十题:
- Oracle数据库dbFirst里面有一张表employee1,包含两列:id和email。MySQL数据库dbSecond里面有一张表employee2,同样包含两列:id和 email。两个数据库的用户名都是myuser,密码都是mypass,两张表的数据量都在一千万行左右。请用shell脚本获取两张表的数据,然后比较出两张表中互不相同的id和email分别输出到文件different_id.txt和different_email.txt。
复制代码 解:
- #!/bin/bash
- # 没有用过Oracle数据库,也没有练习测试的环境,就照网上的“基础教程”依葫芦画瓢吧
- # 把 Oracle 数据库的 id 和 email 查询到文件中
- sqlplus myuser/mypass@dbFirst << EOF
- set heading off;
- spool id1.txt;
- select distinct id from dbFirst.employee1 order by id;
- spool off;
- spool email1.txt;
- select distinct email from dbFirst.employee1 order by email;
- spool off;
- exit;
- EOF
- # 把 Mysql 数据库的 id 和 email 查询到文件中
- mysql -umyuser -pmypass --column-names=0 --execute='select distinct id from dbFirst.employee1 order by id;' > id2.txt
- mysql -umyuser -pmypass --column-names=0 --execute='select distinct email from dbFirst.employee1 order by email;' > email2.txt
- # 比较两个结果
- diff -abBH id1.txt id2.txt | grep -E "<|>" > different_id.txt
- diff -abBH mail1.txt mail2.txt | grep -E "<|>" > different_email.txt
复制代码 |
|