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...//
阅读(1138) | 评论(0) | 转发(0) |