分类: LINUX
2013-07-15 22:56:15
1.文件的搜索和替换操作
(注意:此操作都是在末行模式下进行)
1.1.s/old/new/gc 将当前行的old字符串替换为new字符串,并要求进行确认;其中c表示需要确认;不加就不会提示要求确认;
1.2.n,ms/old/new/gc 将第n行到第m行字符串替换为new字符串,并要求确认;
1.3.%s/old/new/gc 将文件中所有的old字符串替换为new字符串,并不要求确认;(=:,$s/old/new/g)
1.4.:10,20s/^/#/g 在第10行到第20行的行首插入#号;
1.5.:1,10s/$/@@/g 在第1行到第10行的行未插入@@号;
练习:将httpd.conf文件中的第100行到第500行中的httpd替换为ftp,并要求进行确认。
:100,500s/http/ftp/gc
替换为 ftp (y/n/a/q/l/^E/^Y)?
15 次替换,共 10 行
特殊用法:
:%s/^/#/g :%s/$/#/g
2.可视模式下的操作:
v 选择指定的字符;
V 选择指定的行;
ctrl+V 选择指定的块;
x,d 实际是剪切的作用;但是如果不去粘贴,就是删除的效果;
U 可以把所有选择的都变为大写;
u 可以把所有选择的内容都变为小写;
3.VIM的设置
:set nu (number) 设置显示行号
:set nonu 取消行号
:set cursorline 显示当前行的下划线
:set nocursorline 取消当前行的下划线
:set nohlsearch 取消搜索的高亮显示
可以通过帮助命令:help set来完成;
(扩展:多文件操作,用vim通过打开多个文件是,可以使用命令last,first,next等变换文件来操作)
练习
(1)删除/myfile目录下的所有文件,复制/etc/httpd/conf/httpd.conf到/myfile目录下
(2)显示行号
(3)将文件中所有的httpd替换为squid
(4)删除第1行到第450行,第500行到最后一行
(5)将每一行行首的#去掉,在每一行的行尾添加字符"**"
%s/^#//g
(6)将/etc/hosts文件添加到httpd.conf文件的最后面
r /etc/hosts
(7)将httpd.conf中的第1至第5行剪切到文件的最后面
(8)删除第一行到第10行中的前5个字符
先选定块,然后使用delete来删除;当然也可以使用d来删除;
(9)将第10行中的所有字符变为大写
(10)文件另存为/myfile/web.conf
第七章 文件目录的高级操作
1.输入输出重定向
[root@schangech proj]# ls /etc/ -R >file11 把命令的输出内容重定向到文件file11里面;
linux内核对输入输出的描述:
0 内核在工作的时候,默认情况下为0;0号文件代表标准输入;默认为键盘;
1 代表标准输出,默认是终端;一般是显示器;
2 代表错误输出,默认为终端;一般是显示器;
[root@schangech proj]# cat web.conf
[root@schangech proj]# cat 当没有指定文件或者内容时,会等待键盘输入内容。然后输出。
love
love
输入输出重定向
< 标准输入(默认的)[root@schangech proj]# cat
> 标准输出重定向,会覆盖已有的文件内容; [root@schangech proj]# cat web.conf > file00004
[root@schangech proj]# cat web.conf lve 2>error 表示仅仅重定向2号文件到error中,1号文件依旧在屏幕显示;
>> 标准追加输出重定向,将输出的内容追加到文件的末尾;
2> 错误输出重定向;
2>> 错误输出重定向,将输出的内容追加到文件的末尾;
&> 同时表示标准输出和错误输出;[root@schangech proj]# cat lge gwieoagh dsgwe file11 dsg8ewhg &>test1
&>> 将标准输出和错误输出追加到文件的末尾;
练习:1.从键盘创建文件keyboard.txt (使用ctrl+d来正常终止程序)
[root@schangech proj]# cat > keyboard.txt
HELLO
HELLO WORLD !
THANKS !
NI HAO MA
[root@schangech proj]# cat keyboard.txt
HELLO
HELLO WORLD !
THANKS !
NI HAO MA
2.查看/var目录及其下面所有的目录,将结果重定向到log.txt中;
[root@schangech proj]# ls -R /var >log.txt
[root@schangech proj]# tree /var >> log.txt
3.显示error,web.conf,file2,file3,file4文件的内容,分别将标准输出放入std.txt中,将错误输出放入err.txt中;
[root@schangech proj]# cat error web.conf file2 file3 file4 >std.txt 2>err.txt
/dev/null 又名无底洞(黑洞),生成在里面的东西,会消失,不会存在;
[root@schangech proj]# cat error web.conf file2 file3 file4 >std.txt 2>/dev/null
[root@schangech proj]# cat error web.conf file2 file3 file4 >std.txt
cat: file2: 没有那个文件或目录
cat: file3: 没有那个文件或目录
cat: file4: 没有那个文件或目录
[root@schangech proj]# cat a b c d e f g &>test.txt
[root@schangech proj]# cat test.txt
lvoejhawigajgaliwgj
cat: c: 没有那个文件或目录
cat: d: 没有那个文件或目录
cat: e: 没有那个文件或目录
cat: f: 没有那个文件或目录
cat: g: 没有那个文件或目录
| 管道符,将前一个命令的输出作为后一个命令的输入;
4.统计/etc目录下链接文件的数量,并将结果放在sum.txt中;
[root@schangech etc]# find /etc -type l|wc -l >sum.t
5.其他相关命令:
5.1 echo 显示变量的值或显示信息;(回写)
[root@localhost proj]# vim sum.sh
[root@localhost proj]# whereis let
let: /usr/share/man/man1/let.1.gz
[root@localhost proj]# let sum =5+6
bash: let: =5+6: syntax error: operand expected (error token is "=5+6")
[root@localhost proj]# let sum=5+6
[root@localhost proj]# echo $sum
11
[root@localhost proj]# vim sum.sh
[root@localhost proj]# chmod 755 sum.sh
[root@localhost proj]# ls
sum.sh
[root@localhost proj]# ./sum.sh
Please input a number:
10
10
please input a number:
20
20
sum is 30
[root@localhost proj]# echo $[15+12]
27
#echo $PATH 可以显示环境变量
#echo "please input a number:" echo可以显示一般信息;
#echo $[12+17] 可以实现一般简单的计算
#echo $((13+18)) 同上....
5.2.关于引号的使用;
“” 双引号表示弱引用;
‘’ 单引号表示强引用;不对内容做解释;直接输出;
`` 反撇号,在命令当中执行其它命令;
\ 输出转义字符;
[root@localhost proj]# echo '$((13+15))'
$((13+15))
[root@localhost proj]# echo "$((13+15))"
28
[root@localhost proj]# echo "`expr [2+4]`"
[2+4]
注意:在echo命令中使用转义字符时需要加-e选项;
[root@localhost proj]# echo "a b c d"
a b c d
[root@localhost proj]# echo "a b c % d"
a b c % d
[root@localhost proj]# echo "a\n b\n c\n d"
a\n b\n c\n d
[root@localhost proj]# echo "a'\n' b'\n' c'\n' d"
a'\n' b'\n' c'\n' d
[root@localhost proj]# echo "a\t b\t c\t d\t"
a\t b\t c\t d\t
[root@localhost proj]# echo -e "a\t b\t c\t d\t"
a b c d
[root@localhost proj]# echo -e "a\n b\n c\n d\n"
a
b
c
d
5.3.let 计算表达式的值;
[root@localhost proj]# let sum=49+25
[root@localhost proj]# echo $sum
74
5.4.bc 进行算术计算,结果取整数;
#echo "71+5*3"|bc
[root@localhost proj]# echo "71+5*3"|bc
86
6.字符处理命令
6.1.seq 输出一串有序的数字;
#seq 10 20
[root@localhost proj]# seq 10 20
10
20
6.2. -f 指定输出格式
[root@localhost proj]# seq -f %03g 95 105 以前用数字0来填充;
104
105
6.3. -s 指定分隔符;
[root@localhost proj]# seq -s " " 10 15
10 11 12 13 14 15
练习:计算1000到5000的和值;
[root@localhost proj]# seq -s "+" 1000 5000 |bc
12003000
6.4. -w 按相同宽度输出,不足自动补零;
[root@localhost proj]# seq -w 8 13
6.5. 和xargs一起使用,以参数的形式输出;
#seq 15 25|xargs
[root@localhost proj]# seq 15 25 |xargs
15 16 17 18 19 20 21 22 23 24 25
6.6. tr 字符处理及其转换
-c 用字符串1的字符补集来替换指定的字符;
练习:输出st文件中的大写字符: [root@localhost proj]# tr
-d -c [A-Z]
[root@localhost proj]# tr -d -c
[A-Z"\n"]
[root@localhost proj]# tr -d -c
[A-Z"\n"]
-d 删除指定字符串中的指定字符;
[root@localhost proj]# tr -d "A"
-s 删除所有相同连续的字符串,只保留一个字符串;
[root@localhost proj]# tr -s [a-z]
[root@localhost proj]# tr -s
[a-zA-Z0-9]
练习:复制文件/etc/hosts到/proj目录,然后删除/proj/hosts文件中所有空格;
[root@localhost proj]# tr -d " "
#tr "a-z" "A-Z"
[root@localhost proj]# tr "a-z"
"A-Z"
[root@localhost proj]# tr -cs
"[a-zA-Z]" "\n"
[root@localhost proj]# tr -cs
"[a-zA-Z]" "\n"
7.sort 排序命令
[root@localhost proj]# sort st
-u 去除重复行,只显示一行
-f 不区分大小写
-r 逆序排列
8.按指定的字段进行排序;默认以空格或tab作为分隔符;
格式:sort + n-m file 表示按从第n字段到第m字段的字符进行排序;
[root@localhost proj]# sort file
[root@localhost proj]# sort +2 -3 file
-t 指定分隔符;
[root@localhost proj]# sort -t: +2 -3 file
-k 指定字段进行排序
[root@localhost proj]# sort -k3 file
12 23 34 45
56 47 78 89
55 67 89 45
ab bc cd de
op pq qr rs
9.uniq 去除重复行
[root@localhost proj]# uniq file1
[root@localhost proj]# uniq file1
aaa bbb ccc
111 222 333
aaa bbb ccc
abc bcd dcf
-d 显示重复行
-u 显示没有重复的行
[root@localhost proj]# uniq file1 -u 仅仅显示没有重复过的行
aaa bbb ccc
111 222 333
abc bcd dcf
[root@localhost proj]# uniq file1 -d 仅仅显示重复了的行
aaa bbb ccc
[root@localhost proj]# uniq file1 -c 显示重复行的次数;
1 aaa bbb ccc
1 111 222 333
2 aaa bbb ccc
1 abc bcd dcf
10.cut 按列来进行截取文件中的内容;
例如:取出passwd文件中的用户名;
[root@localhost proj]# cut -d: -f1 passwd
-d: 表示分隔符,-f1 表示取第一列
-b 按字节截取 -c 按字符进行截取
11.grep 过滤指定字符串
^ 是以什么开头的;
$ 是以什么结尾的;
例:显示文件passwd中包含root的行;
[root@schangech proj]# grep root passwd
仅显示以root开头的行;
[root@schangech proj]# grep root passwd|grep ^root
root:x:0:0:root:/root:/bin/bash
[root@schangech proj]# grep ^root passwd
root:x:0:0:root:/root:/bin/bash
[root@schangech proj]# grep bash$ passwd 以bash结尾的行
-v是取反的效果
[root@schangech proj]# grep -v bash$ passwd 不以bash结尾的行,
[root@schangech proj]# grep "^$" /etc/httpd/conf/httpd.conf -v 取反不是空行
练习:显示文件httpd.conf中所有有效的行;
[root@schangech proj]# grep -v ^# /etc/httpd/conf/httpd.conf
[root@schangech proj]# grep -v ^# "^$" /etc/httpd/conf/httpd.conf
[root@schangech proj]# tr -d " "
-i 忽略大小写
[root@schangech proj]# grep -i "httpd" httpd.conf
-l 显示文件名,在多文件操作时使用
[root@schangech proj]# grep -l "php" *
-h 不显示文件名,在多文件操作时使用
[root@schangech proj]# grep -h "php" *
[root@schangech conf.d]# grep -h "h*p" * 显示以h开头,以p结尾,中间包含任意多个字符的文件;
-n 显示内容所在行
[root@schangech proj]# grep -n "php" *
[root@schangech conf.d]# grep -n "h*p" *
11.wc 统计信息
#wc -l httpd.conf
[root@schangech conf.d]# wc -l welcome.conf
11 welcome.conf
-l 统计行
-c 统计字节数
-w 统计单词
[root@schangech proj]# wc -l httpd.conf
1009 httpd.conf
[root@schangech proj]# wc -c httpd.conf
34418 httpd.conf
12.diff 比较文件
patch 生成补丁,两者组合使用:
(打补丁通常是打在源码上面。)
先比较差异,然后通过弥补差异就一致了;
[root@schangech proj]# diff -u 001 002 比较两个不同文件的区别;
[root@schangech proj]# diff -Nur 001 002 如果是目录的,需要添加-rN
[root@schangech proj]# diff -u 001 002 >file.patch 先比较不同,然后重定向到一个patch的补丁中;
[root@schangech proj]# ls
001 002 file.patch
[root@schangech proj]# patch < file.patch 然后打补丁;
patching file 001
[root@schangech proj]# ls
001 002 file.patch
[root@schangech proj]# diff -u 001 002 最后可以实验一下,结果是一样的;
-P 是去掉目录;
补丁恢复:[root@schangech proj]# patch -R < file.patch