Chinaunix首页 | 论坛 | 博客
  • 博客访问: 398359
  • 博文数量: 59
  • 博客积分: 5195
  • 博客等级: 大校
  • 技术积分: 645
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-01 14:38
文章分类

全部博文(59)

文章存档

2017年(1)

2011年(10)

2010年(1)

2009年(9)

2008年(1)

2007年(35)

2006年(2)

我的朋友

分类: LINUX

2009-01-12 10:54:23

1.重定向
1>file 重定向stdout到文件file
1>>file 重定向并追加stdout到文件file
2>file 重定向stderr到文件file
&>file 将stdout和stderr都重定向到文件file
2>&1 重定向stderr到stdout;将错误消息的输出, 发送到与标准输出所指向的地方
i>&j 重定向文件描述符i到j;指向i文件的所有输出都发送到j
n<&- 关闭输入文件描述符n
n>&- 关闭输出文件描述符n

example1:
echo 1234567890 > File    # 写字符串到"File".
exec 3<> File             # 打开"File"并且将fd 3分配给它.
read -n 4 <&3             # 只读取4个字符.
echo -n . >&3             # 写一个小数点.
exec 3>&-                 # 关闭fd 3.
cat File                  # ==> 1234.67890

example2:
cat *.txt | sort | uniq > file
对所有txt文件的输出进行排序, 并删除重复行,最后将结果保存到file中

2.位置参数
$0,$1,$2... 从命令行传递到脚本的参数
$# 命令行参数的个数
$*和$@ 命令行中所有的参数
$? 返回值
$! 运行在后台的最后一个进程的PID
$$ 脚本自身的进程ID

3.文件测试操作符
-e 文件存在
-f 表示这个文件是一个一般文件(并不是目录或者设备文件)
-s 文件大小不为零
-d 表示这是一个目录
-b 表示这是一个块设备
-c 表示这是一个字符设备
-p 这个文件是一个管道
-h或-L 这是一个符号链接
-S 表示这是一个socket
-t 文件(描述符)被关联到一个终端设备上;用来检测脚本中的stdin([ -t 0 ]) 或者stdout([ -t 1 ])是否来自于一个终端
-r 文件是否具有可读权限
-w 文件是否具有可写权限
-x 文件是否具有可执行权限
-O 判断你是否是文件的拥有者
-G 文件的group-id是否与你的相同
-N 从文件上一次被读取到现在为止, 文件是否被修改过
f1 -nt f2 文件f1比文件f2新
f1 -ot f2 文件f1比文件f2旧
f1 -ef f2 文件f1和文件f2是相同文件的硬链接

4.比较操作符
整数比较:
-eq 等于 if [ "$a" -eq "$b" ]
-ne 不等于 if [ "$a" -ne "$b" ]
-gt 大于 if [ "$a" -gt "$b" ]
-ge 大于等于 if [ "$a" -ge "$b" ]
-lt 小于 if [ "$a" -lt "$b" ]
-le 小于等于 if [ "$a" -le "$b" ]
< 小于(在双括号中使用) (("$a" < "$b"))
<= 小于等于(在双括号中使用) (("$a" <= "$b"))
> 大于(在双括号中使用) (("$a" > "$b"))
>= 大于等于(在双括号中使用) (("$a" >= "$b"))

字符串比较:
= 等于 if [ "$a" = "$b" ]
== 等于 if [ "$a" == "$b" ]
!= 不等号 if [ "$a" != "$b" ]
< 小于, 按照ASCII字符进行排序 if [[ "$a" < "$b" ]]
if [ "$a" \< "$b" ] 注意"<"使用在[ ]结构中的时候需要被转义
> 大于, 按照ASCII字符进行排序 if [[ "$a" > "$b" ]]
if [ "$a" \> "$b" ] 注意">"使用在[ ]结构中的时候需要被转义
-z 字符串为"null", 意思就是字符串长度为零
-n 字符串不为"null"; 当-n使用在中括号中进行条件测试的时候, 必须要把字符串用双引号引用起来

逻辑比较:
-a(&&) 逻辑与
exp1 -a exp2 如果表达式exp1和exp2都为真的话, 那么结果为真.
-o(||) 逻辑或
exp1 -o exp2 如果表达式exp1和exp2中至少有一个为真的话, 那么结果为真.

find(当前目录和所有子目录):
and:逻辑与,在命令中用“-a”表示,是系统缺省的选项,表示只有当所给的条件都满足时,寻找条件才算满足
or:逻辑或,在命令中用“-o”表示。该运算符表示只要所给的条件中有一个满足时,寻找条件就算满足。
not:逻辑非,在命令中用“!”表示。该运算符表示查找不满足所给条件的文件。

1、删除当前目录下所有的.txt文件
find . -name "*.txt" -exec rm -rf {} \;
2、删除除了.txt的所有文件
find . ! -name "*.txt" -exec rm -rf {} \;
3、删除当前目录下所有文件
find . -print | xargs rm -rf
4、strip当前目录下所有文件
find . -print | xargs strip

sed:
1.替换
sed -i 's/111/222/g' filename   把文件filename中的111替换为222
sed -i 's/.*/&xxx/g' filename   在文件filename的所有行之后添加xxx
sed -i 's/.*/xxx&/g' filename   在文件filename的所有行之前添加xxx
sed -i 's/^.//g' filename       删除filename所有行的第一个字符
sed -i 's/.$//g' filename       删除filename所有行的最后一个字符
2.追加
sed '/条件/a\追加内容' *.txt

a:在符合条件的行后追加
"条件"可以为文本或行号,如:
sed -i '10a\sullg' test.txt    在第10行后追加一行sullg
sed -i '/unix/a\\t\twindows' test.txt    在符合条件unix行之后追加一行windows,在windows之前有两个tab共8个空格(tab=4个空格)
sed -i '/unix/a\windows\nlinux' test.txt    在符合条件unix行之后追加两行,第一行为windows,第二行为linux
3.插入
sed '/条件/i\插入内容' *.txt

i:在符合条件的行前插入
例子同上面的追加,只是把a换成i
4.删除
sed '/条件/d' *.txt

d: 删除符合条件的行
"条件"可以为文本或行号,如:
sed -i '10d' test.txt    删除第10行
sed -i '/sullg/d' test.txt    删除符合条件sullg的行
5.更改
sed '/条件/c' *.txt

c: 更改符合条件的行
sed -i '10c\sullg' test.txt    把第10行更改为sullg
sed -i '/sullg/c\linux' test.txt    把符合条件sullg的行更改为linux

vim:
1.删除列
1)删除第2、10行的第一列
2,10s/\%1c.//
2)删除第2、10行的前三列
2,10s/\%1c...//

阅读(1093) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~