- 论坛徽章:
- 0
|
本帖最后由 Dreamhat 于 2012-03-24 15:46 编辑
环境:
Red Hat Enterprise Linux WS release 4 (Nahant Update 8 )
2.6.9-89.ELsmp #1 SMP Mon Apr 20 10:34:33 EDT 2009 i686 i686 i386 GNU/Linux
第一题:
有区别- awk -F ' '
- 设定FS变量(输入域分隔符)为空格(一个或多个),或者tab(1个或多个),或者换行。而且会去除行首行末多余的空格
复制代码- awk -F '[ ]'
- 设定FS变量(输入域分隔符)为一个空格
复制代码- awk -F '[ ]+'
- 设定FS变量(输入域分隔符)为一个或者多个空格
复制代码 举个例子:
- [tlu@tlu-linux chinaunix]$ cat -A file
- aaa bbb ccc^Iddd eee$
- 上面这个file文件里aaa之前是有个空格的,code里显示不出。
- [tlu@tlu-linux chinaunix]$ awk -F ' ' '{print $4}' file
- ddd
- [tlu@tlu-linux chinaunix]$ awk -F '[ ]' '{print $4}' file
- bbb
- [tlu@tlu-linux chinaunix]$ awk -F '[ ]+' '{print $4}' file
- ccc ddd
复制代码 第二题:
- awk '/foo1/,/foo2/'
- sed -n '/foo1/,/foo2/p'
复制代码 这两个命令功能基本一样,但是有差异:
当foo1和foo2在同一行时,两者执行结果不同。
sed是行操作,找到有包含foo1的行时(同一行有无foo2不影响),打印开关(p)打开,然后再往下一行行的找foo2,如果找到了,打印开关就关闭。再往下如果找到foo1,打印开关再打开,如此反复直到文件末尾。
awk是先找foo1,然后找foo2(可以在同一行里),然后把找到的所有行打印出来,如此反复直到文件末尾。
例子:
- [tlu@tlu-linux chinaunix]$ cat file
- foo1foo2
- foo2
- foo1
- end
- [tlu@tlu-linux chinaunix]$ awk '/foo1/,/foo2/' file
- foo1foo2
- foo1
- end
- [tlu@tlu-linux chinaunix]$ sed -n '/foo1/,/foo2/p' file
- foo1foo2
- foo2
- foo1
- end
复制代码 第三题:
如何用最简单的方法列举出 "a b c e f" 和"1 2 3" 的所有组合? 第四题:
字符串 'aaabcccaaabbbccc',连续的字母作为一个子字符串,从左往右,去重复后,变为 'aaabcccbbb' ,
awk或sed实现,不使用管道。
这道不太会
- echo 'aaabcccaaabbbccc' | sed 's#\(a\{1,\}\)\(b\{1,\}\)\(c\{1,\}\)\(a\{1,\}\)\(b\{1,\}\)\(c\{1,\}\)#\1\2\3\5#'
复制代码 第五题: 既然双引号中的\<newline>是续行符,为什么结果不是"foo barabc def"?
echo "$(<urfile)"
这个命令是执行一个subshell运行<urfile,然后echo出来
需要用eval echo "$(<urfile)"再进行一次命令行处理,才能达到打印出"foo barabc def"的效果
第六题:foo也bar之间为什么只有一个空格?
$()命令替换执行后,bash会根据$IFS中的字符做分割符进行从新分隔单词,所以多个空格,对echo看起来都一样的,是一个分隔符。
第七题:
- sed -n '/a/,'$(grep -n c file|tail -1|awk -F: '{print $1}')p'' file
复制代码 第八题:
- for (( i=1; i<9; i++))
- do
- [[ $i -ne 8 ]] && let "j = $i + 2"
- echo $(seq $i $j)
- done
复制代码 第九题:
- #!/bin/bash
- RESULT=./change_oracle_password_`date +%Y%m%d`
- > ${RESULT}
- echo -e "HOST\tRESULT\tNEW_PASSWORD" >> ${RESULT}
- for i in {1..1000}
- do
- host=client$(printf "%04d\n" $i)
- password=$(tr -dc 'A-Za-z0-9' < /dev/urandom | fold -w 8 |grep .*[0-9].* -|grep .*[A-Z].* -|grep .*[a-z].* -|head -n 1)
- ssh $host "echo "$password" | /usr/bin/passwd --stdin oracle"
- if [ $? -eq 0];then
- echo -e "$host\tsuccess\t$password" >> ${RESULT}
- else
- echo -e "$host\tfailed" >> ${RESULT}
- fi
- done
复制代码 第十题:
- #!/bin/bash
- #以下oracel相关部分google搜来,未测试
- export ORACLE_HOME=/path/to/oracle/
- export ORACLE_SID=...
- export PATH=$ORACLE_HOME/bin:$PATH
- sqlplus -silent <<SQLScript
- myuser/mypass
- set pages 0
- set feedback off
- set echo off
- spool ./dump_employee1_id
- select id from employee1
- spool off
- SQLScript
- sqlplus -silent <<SQLScript
- myuser/mypass
- set pages 0
- set feedback off
- set echo off
- spool ./dump_employee1_email
- select email from employee1
- spool off
- SQLScript
- mysql -u myuser -pmypass --batch -e 'select id from employee2' dbSecond | sed '1d' > dump_employee2_id
- mysql -u myuser -pmypass --batch -e 'select email from employee2' dbSecond | sed '1d' > dump_employee2_email
- for i in "dump_employee1_id" "dump_employee2_id" "dump_employee1_email" "dump_employee2_email"
- do
- sort $i > ${i}_sort
- done
- comm -23 dump_employee1_id_sort dump_employee2_id_sort > different_id.txt
- comm -13 dump_employee1_id_sort dump_employee2_id_sort >> different_id.txt
- comm -23 dump_employee1_email_sort dump_employee2_email_sort > different_email.txt
- comm -13 dump_employee1_email_sort dump_employee2_email_sort >> different_email.txt
复制代码 最后谢谢各位评委。。。
|
|