- 论坛徽章:
- 0
|
本帖最后由 angle4 于 2011-05-20 15:25 编辑
1. 用最简洁的命令列出当前目录下的一级子目录,可以不包含隐藏目录(目录名以.开头的目录)
- # 显示当前目录下的子目录
- echo "当前目录下的子目录"
- ls -l | grep -E '^d' | awk '{print $8}'
- # 显示当前目录下的子目录, 包含隐藏目录
- echo "当前目录下的子目录, 包含隐藏目录"
- ls -la | grep -E '^d' | awk '{print $8}' | grep -Ev '^\.$|^\.\.
- # 下面的也可以, 没法现那个更简洁
- # find . -maxdepth 1 -type d ! -regex '^\.
复制代码 2. GNU sed 提供了-i选项,为什么有人说sed -i 并不象 ed 一样真正的编辑文件?(提示:观察文件改变前后的inode)
- 的确, sed -i 是先用sed处理完,再rename操作的。
- 从 strace sed -i 's/1/x/g' out 就可以清楚的看到。
- 看inode也很清楚,
- $ cal > out
- $ ls -i out
- 1541258 out
- $ sed -i 's/2/x/g' out && ls -i out
- 1541255 out
复制代码 3. 用shell写一个cgi脚本,提供一个简单的webmail介面,将本地的一个文件通过web服务器发送到指定的邮箱
- #!/bin/bash
- # 用shell写一个cgi脚本,提供一个简单的webmail介面,将本地的一个文件通过web服务器发送到指定的邮箱
- echo Content-type: text/html
- echo ""
- email=$(echo "$QUERY_STRING" | sed -n 's/^.*email=\([^&]*\).*$/\1/p' | sed "s/%40/@/g")
- file_name=$(echo "$QUERY_STRING" | sed -n 's/^.*file_name=\([^&]*\).*$/\1/p' | sed "s/%20/ /g")
- /bin/cat << EOF
- <html>
- <head>
- <title>webmail cgi</title>
- </head>
- <body>
- EOF
- if [ -z $email -o -z $file_name ]; then
- /bin/cat << EOF
- <form method="get">
- Email: <input type="text" name="email"/><br />
- File : <input type="file" name="file_name"/><br />
- <input type="submit" value="submit"/><br />
- </form>
- EOF
- else
- mail -s $file_name $email < $file_name \
- && echo "Done.</br>" \
- || echo "Error ..."
- #echo "email: $email</br>"
- #echo "file_name: $file_name</br>"
- fi
- /bin/cat << EOF
- </body>
- </html>
- EOF
复制代码 4. awk -F'' 与 awk -F '' 一样吗?
- 不一样,
- awk -F field-separator # awk -F ':'
- awk -Ffield-separator # awk -F:
- 所以, awk -F '' 结果是每个字符都是一个字段; 而, awk -F'' 是有语法错误的.
复制代码 5. 这条语句有什么作用? sed -if /script/scr.sedcc test.txt
- -if 将test.txt备份为 test.txtf
- /script/scr.sedcc 会做为sed命令执行, 结果就是在test.txt中查找包含script的行,一行一行的查找,找到后,将该行的r.sed替换为空,每行只替换第一次找到的.
- sed 中s是字符串替换,c在这是分割符,然后就很明显了.
复制代码 6. #!/bin/sh
# the next line restarts using tclsh \
exec tclsh "$0" "$@"
是如何执行的?与"#!/usr/local/bin/tclsh"相比,它有什么优点?
- 执行过程:
- sh首先处理这个脚本, 忽略第二行(注释), 然后,执行第三行.
- exec 使shell停止执行,并且开始运行tclsh, tclsh重新处理这个脚本,它把这三行都作为注释(因为第一行末有个\, 所以第三行也是注释).
- 这个脚本后面的内容有tclsh解释、执行.
- 优点:
- 1. 不用考虑tclsh的绝对路径,只要PATH中可以找到就行, shebang中可执行文件必须写绝对路径,而不同的发行版tclsh的默认安装路径可能不同.
- 2. 可以避免shebang过长, 有些早期发行版对shebang长度有限制.
- 3. shebang中必须是二进制的可执行文件,而不能是一个shell脚本, 而,有时为了处理多架构和多个操作系统,tclsh很可能是一个shell脚本.
- 4. 把tclsh做成一个脚本,有助于使用不同版本的tclsh.
复制代码 7. #!/bin/sed -f" shebang 后可有其它字符吗?为什么?
- 可以, 如: #!/bin/sed -fa.sed, a.sed 将作为 -f 的参数. -f后的所有字符串将作为一个参数, 所以, #!/bin/sed -fa.sed -fb.sed将报错,除非你当前目录有个文件名为"a.sed -fb.sed".
复制代码 8. GNU awk的$1=$1到底有什么作用?$0=$0呢?
- # from awk manpage
- # Assigning a value to an existing field causes the whole record to be rebuilt when $0 is referenced.
- # Similarly, assigning a value to $0 causes the record to be resplit, creating new values for the fields.
- # sample code
- $ echo 'a b c' | awk '{print $0; $1=$1;OFS=":"; FS=":"; print $0; print $1}'
- a b c
- a:b:c
- a
- $ echo 'a b c' | awk '{print $0; $0=$0;OFS=":"; FS=":"; print $0; print $1}'
- a b c
- a b c
- a
- 从上面的例子可以看出:
- $1=$1导致整个记录($0)重新创建,字段也会根据FS的值重新分割.
- $0=$0只会使字段根据FS的值重新分割.
复制代码 |
|