find命令
一、原理
功能:在目录结构中搜索文件,并执行指定的操作。此命令提供了相当多的查找条件,功能很强大。
语法:find 起始目录 寻找条件 操作
说明:find命令从指定的起始目录开始,递归地搜索其各个子目录,查找满足寻找条件的文件并对之采取相关的操作。
该命令提供的寻找条件可以是一个用逻辑运算符not、and、or组成的复合条件。逻辑运算符and、or、not的含义为:
(1)and:逻辑与,在命令中用“-a”表示,是系统缺省的选项,表示只有当所给的条件都满足时,寻找条件才算满足。例如:
$ find –name ’tmp’ –xtype c -user ’inin’
该命令寻找三个给定条件都满足的所有文件。
(2)or:逻辑或,在命令中用“-o”表示。该运算符表示只要所给的条件中有一个满足时,寻找条件就算满足。例如:
$ find –name ’tmp’ –o –name ’mina*’
该命令查询文件名为’tmp’或是匹配’mina*’的所有文件。
(3)not:逻辑非,在命令中用“!”表示。该运算符表示查找不满足所给条件的文件。例如:
$ find ! –name ’tmp’
该命令查询文件名不是’tmp’的所有文件。
需要说明的是:当使用很多的逻辑选项时,可以用括号把这些选项括起来。为了避免Shell本身对括号引起误解,在话号前需要加转义字符“”来去除括号的意义。
例:$ find (–name ’tmp’ –xtype c -user ’inin’ )
寻找条件有以下选项:
首先,下列各个选项中的n值可以有三种输入方式,假设n为20,则:
+20 表示20以后(21,22,23等)
-20 表示20以前(19,18,17等)
20 表示正好是20
1. 以名称和文件属性查找。
- name ’字串’ 查找文件名匹配所给字串的所有文件,字串内可用通配符*、?、[ ]。
- lname ’字串’ 查找文件名匹配所给字串的所有符号链接文件,字串内可用通配符*、?、[ ]。
-gid n 查找属于ID号为n的用户组的所有文件。
-uid n 查找属于ID号为n的用户的所有文件。
-group ’字串’ 查找属于用户组名为所给字串的所有的文件。
-user ’字串’ 查找属于用户名为所给字串的所有的文件。
-empty 查找大小为0的目录或文件。
-path ’字串’ 查找路径名匹配所给字串的所有文件,字串内可用通配符*、?、[ ]。
-perm 权限 查找具有指定权限的文件和目录,权限的表示可以如711,644。
-size n[bckw] 查找指定文件大小的文件,n后面的字符表示单位,缺省为b,代表512字节的块。
-type x 查找类型为x的文件,x为下列字符之一:
b 块设备文件
c 字符设备文件
d 目录文件
p 命名管道(FIFO)
f 普通文件
l 符号链接文件(symbolic links)
s socket文件
-xtype x 与-type基本相同,但只查找符号链接文件。
2. 以时间为条件查找
- amin n 查找n分钟以前被访问过的所有文件。
- atime n 查找n天以前被访问过的所有文件。
- cmin n 查找n分钟以前文件状态被修改过的所有文件。
- ctime n 查找n天以前文件状态被修改过的所有文件。
- mmin n 查找n分钟以前文件内容被修改过的所有文件。
- mtime n 查找n天以前文件内容被修改过的所有文件。
3. 可执行的操作
- exec 命令名称 {} 对符合条件的文件执行所给的Linux 命令,而不询问用户是否需要执行该命令。{}表示命令的参数即为所找到的文件;命令的末尾必须以“ ;”结束。
- ok 命令名称 { } 对符合条件的文件执行所给的Linux 命令,与exec不同的是,它会询问用户是否需要执行该命令。
- ls 详细列出所找到的所有文件。
- fprintf 文件名 将找到的文件名写入指定文件。
- print 在标准输出设备上显示查找出的文件名。
- printf 格式 格式的写法请参考有关C语言的书。
例1:查找当前目录中所有以main开头的文件,并显示这些文件的内容。
$ find . - name ‘main*’ - exec more {} ;
例2:删除当前目录下所有一周之内没有被访问过的a .out或*.o文件。
$ find . (- name a.out - o - name ‘*.o’)
> - atime +7 - exec rm {} ;
说明如下:
命令中的“.”表示当前目录,此时find将从当前目录开始,逐个在其子目录中查找满足后面指定条件的文件。(和)表示括号(),其中的“”称为转义 符。之所以这样写是由于对Shell而言,(和)另有不同的含义,而不是这里的用于组合条件的用途。“- name a.out”是指要查找名为a.out的文件;“- name ‘*.o’”是指要查找所有名字以 .o结尾的文件。这两个- name之间的- o表示逻辑或(or),即查找名字为a.out或名字以 .o结尾的文件,find在当前目录及其子目录下找到这佯的文件之后,再进行判断,看其最后访问时间是否在7天以前(条件-atime +7),若是,则对该文件执行命令rm(- exec rm{ };)。其中{ }代表当前查到的符合条件的文件名,;则是语法所要求的。上述命令中第一行的最后一个是续行符。当命令太长而在一行写不下时,可输入一个,之后系统将显示 一个>,指示用户继续输入命令。
locate命令
locate命令用于查找文件,它比find命令的搜索速度快,它需要一个数据库,这个数据库由每天的例行工作(crontab)程序来建立。当我们建立好这个数据库后,就可以方便地来搜寻所需文件了。
该命令的一般形式为:
locate 相关字
例如:查找相关字issue
$ locate issue
/etc/issue
/etc/issue.net
/usr/man/man5/issue.5
/usr/man/man5/issue.net.5
二、经典实例
1、查找目录
find -/home -type d -name 'quejinlong*' //从/home开始查找目录名包含quejinlong的目录
2、改变当前目录下所有文件的所有权
find . -exec chown OWNER.[GROUP] {} \; (Solaris平台)
find . -exec chown -R OWNER.[GROUP] {} \; (Linux平台)
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=799004
......
显示全文...
[2008年4月24日星期四]
linux基础-查找命令
标签: 类UNIX系统, LINUX学习 0 评论
[2008年4月23日星期三]
转载__复制服务器的监控脚本
标签: 技术收藏, 类UNIX系统, 应用服务 0 评论
原文地址:http://www.chinaunix.net/jh/21/1030139.html
http://www.chinaunix.net 作者:unixer123 发表于:2008-01-09 17:44:39
写了一个复制服务器的监控脚本, 放在crontab中, 首先监控repserver,rsm是否正常运行,如果down掉, 则重新启动进程
否则, 继续执行admin who_is_down语句, 将输出结果放到一个文件中, 逐行分析时候是否存在指定的复制关系, 有的话
则形成resume connection to "复制关系“的语句, 然后执行此语句。
#!/bin/ksh
HOME_DIR=/export/home/sybaserep
LD_LIBRARY_PATH=/export/home/sybaserep/OCS-12_5/lib:/export/home/sybaserep/OCS-12_5/lib3p:
export HOME_DIR LD_LIBRARY_PATH
PROCESS_LIST=$HOME_DIR/script/process_list
LOG=$HOME_DIR/script/log
TMPFILE=$HOME_DIR/script/tmpfile
REP_CONN_LIST=$HOME_DIR/script/rep_conn_lst
DOWN="NO"
while read LINE
do
ps -ef | grep `echo $LINE | awk '{print $1}'` | grep -v grep
if [ "$?" = 0 ]
then
DOWN = "YES"
process_name=`echo $LINE | awk '{print $1}'`
echo "$process_name failed at `date`" >> $LOG
start_process=`echo $LINE | awk '{print $2" "$3}'`
$start_process
echo "$process_name restart at `date`" >> $LOG
echo "--------------------------------" >> $LOG
sleep 60
fi
done < $PROCESS_LIST
if [ $DOWN = "YES" ]
then
exit 1
fi
eval $HOME_DIR/OCS-12_5/bin/isql -Usa -Pxxxxxxxx -Sxxxxxxxx -i$HOME_DIR/script/getdown.sql > $TMPFILE
while read REP_CONN
do
cat $TMPFILE | grep $REP_CONN
echo "cat" >> $LOG
if [ "$?" != 0 ]
then
sql="resume connection to $LINE"
echo $sql > $TMP_DIR/script/resume.sql
echo "go" >> $TMP_DIR/script/resume.sql
eval $HOME_DIR/OCS-12_5/bin/isql -Usa -Pxxxxxxxx -Sxxxxxxxx -i$HOME_DIR/script/resume.sql >> $LOG
sleep 30
fi
done < $REP_CONN_LIST
date >> $LOG
......
显示全文...
[2008年4月19日星期六]
编译mplayer Cannot find header either inttypes.h or bitypes.h
标签: 类UNIX系统 0 评论
编译mplayer rc2, configure 的时候出现以下error:
Checking for inttypes.h (required) … no
Checking for bitypes.h (inttypes.h predecessor) …
Error: Cannot find header either inttypes.h or bitypes.h (see
DOCS/HTML/en/faq.h
google了好久没有找到解决办法,感觉一定是缺了什么c的头文件,最终的解决办法
apt-get install libc6-dev
运行过程中安装了两个包:
libc6-dev
留下记录,以便后查
另外在加一个error:
Error: X11 support required for GUI compilation
解决:
sudo apt-get install libgtk2.0-dev
解决!
......
显示全文...
[2008年4月15日星期二]
RHEL笔记__USER&GROUP
标签: 类UNIX系统 0 评论
1. su 与su - 的区别
su user 切换到user的使用者
su - user 切换到user,并重新启动user的login shell,载入user的环境变数
2。
find out who you are:
whoami
find out what groups you belong to:
groups , id
find out who is logged in
users,who,w
login/reboot history:
last
......
显示全文...
困难要一次克服
标签: 生活·思考 0 评论
找工作我坚持一个原则:宁缺勿烂!不要感觉好久没有上班了就稀里糊涂找家公司做了,到时候做的不开心还是想出来,又回到原点!困难要一次克服!”
快两个月没有上班了,快闷死了,只是每天不停的看书。刚才一个好朋友给我发来这条信息,他说得很对,其实辞职时我就坚定了这个原则的,不然我现在已经在上班了。不知道后面的路还有多远,但是要坚持下去!
......
显示全文...
[2008年4月14日星期一]
sort用法
标签: 技术收藏, 类UNIX系统, LINUX学习 0 评论
实用的分类(s o r t)操作。
• uniq。
• join。
• cut。
• paste。
• split。
sort用法
s o r t命令选项很长,下面仅介绍各种选项。
选项
s o r t命令的一般格式为:
代码:
sort -cmu -o output_file [other options] +pos1 +pos2 input_files
下面简要介绍一下s o r t的参数:
引用:
-c 测试文件是否已经分类。
-m 合并两个分类文件。
-u 删除所有复制行。
-o 存储s o r t结果的输出文件名。
其他选项有:
引用:
-b 使用域进行分类时,忽略第一个空格。
-n 指定分类是域上的数字分类。
-t 域分隔符;用非空格或t a b键分隔域。
-r 对分类次序或比较求逆。
+n n为域号。使用此域号开始分类。
n n为域号。在分类比较时忽略此域,一般与+ n一起使用。
post1 传递到m,n。m为域号,n为开始分类字符数;例如4,6意即以第5域分类,从第7个字符开始。
保存输出
- o选项保存分类结果,然而也可以使用重定向方法保存。下面例子保存结果到r e s u l t s . o u t:
代码:
$sort video.txt >results.out
启动方式
缺省情况下, s o r t认为一个空格或一系列空格为分隔符。要加入其他方式分隔,使用- t选s o r t执行时,先查看是否为域分隔设置了- t选项,如果设置了,则使用它来将记录分隔成域0、域1等等
;如果未设置,用空格代替。缺省时s o r t将整个行排序,指定域号的情况例外。
下面是文件v i d e o . t x t的清单,包含了上个季度家电商场的租金情况。各域为:(1)名称,(2)供货区代码,(3)本季度租金,(4)本年租金。域分隔符为冒号。为此对此例需使用‘ - t'选项。文件如下:
代码:
$ cat video.txt
Boys in Company C:HK:192:2192
Alien:HK:119:1982
The Hill:KL:63:2972
Aliens:HK:532:4892
Star Wars:HK:301:4102
A Few Good Men:KL:445:5851
Toy Story:HK:239:3972
sort对域的参照方式
关于s o r t的一个重要事实是它参照第一个域作为域0,域1是第二个域,等等。s o r t也可以使用整行作为分类依据。
文件是否已分类
怎样分辨文件是否已分类?如果只有3 0行,看看就知道了,但如果是4 0 0行呢,使用s o r t - c通知s o r t文件是否按某种顺序分类。
代码:
$ sort -c video.txt
sort: video.txt:2: disorder: Alien:HK:119:1982
结果显示未分类,
现在将之分类,再试一次:
代码:
$ sort -t: video.txt >video2.txt
$ sort -c video2.txt
$
返回提示符表明已分类。然而如果测试成功,返回一个信息行会更好。
基本sort
最基本的s o r t方式为sort filename,按第一域进行分类(分类键0)。实际上读文件时s o r t操作将行中各域进行比较,这里返回基于第一域s o r t的结果
代码:
$ sort -t: video.txt
A Few Good Men:KL:445:5851
Alien:HK:119:1982
Aliens:HK:532:4892
Boys in Company C:HK:192:2192
Star Wars:HK:301:4102
The Hill:KL:63:2972
Toy Story:HK:239:3972
sort分类求逆
如果要逆向s o r t结果,使用- r选项。在通读大的注册文件时,使用逆向s o r t很方便。下面是按域0分类的逆向结果。
代码:
$ sort -t: -r video.txt
Toy Story:HK:239:3972
The Hill:KL:63:2972
Star Wars:HK:301:4102
Boys in Company C:HK:192:2192
Aliens:HK:532:4892
Alien:HK:119:1982
A Few Good Men:KL:445:5851
按指定域分类
有时需要只按第2域(分类键1)分类。这里为重排报文中供应区代码,使用t 1,意义为按分类键1分类。下面的例子中,所有供应区代码按分类键1分类;注意分类键2和3对应各域也被分类。
代码:
$ sort -t: +1 video.txt
Alien:HK:119:1982
Boys in Company C:HK:192:2192
Toy Story:HK:239:3972
Star Wars:HK:301:4102
Aliens:HK:532:4892
A Few Good Men:KL:445:5851
The Hill:KL:63:2972
前几个第二域都是HK,第三域:119,192,301,489,532,63,按第一个数字分了,因此必须指定多域及数值域
数值域分类
依此类推,要按第三分类键分类,使用t 3。但是因为这是数值域,即为数值分类,可以使用- n选项。下面例子为按年租金分类命令及结果:
代码:
$ sort -t: +3n video.txt
Alien:HK:119:1982
Boys in Company C:HK:192:2192
The Hill:KL:63:2972
Toy Story:HK:239:3972
Star Wars:HK:301:4102
Aliens:HK:532:4892
A Few Good Men:KL:445:5851
如果不指定n,如下
代码:
$ sort -t: +2 video.txt
Alien:HK:119:1982
Boys in Company C:HK:192:2192
Toy Story:HK:239:3972
Star Wars:HK:301:4102
A Few Good Men:KL:445:5851
Aliens:HK:532:4892
The Hill:KL:63:2972
o r t只查看第3域每个数值的第一个数,并按其分类,然后再按第二个数依次下去。
代码:
$ sort -t: +2n video.txt
The Hill:KL:63:2972
Alien:HK:119:1982
Boys in Company C:HK:192:2192
Toy Story:HK:239:3972
Star Wars:HK:301:4102
A Few Good Men:KL:445:5851
Aliens:HK:532:4892
数值域倒序:
代码:
$ sort -t: +2nr video.txt
Aliens:HK:532:4892
A Few Good Men:KL:445:5851
Star Wars:HK:301:4102
Toy Story:HK:239:3972
Boys in Company C:HK:192:2192
Alien:HK:119:1982
The Hill:KL:63:2972
唯一性分类
有时,原文件中有重复行,这时可以使用- u选项进行唯一性(不重复)分类以去除重复行,本例中A l i e n有相同的两行。带重复行的文件如下,其中A l i e n插入了两次:
代码:
$ echo "Aliens:HK:532:4892" >> video.txt
$ cat video.txt
Boys in Company C:HK:192:2192
Alien:HK:119:1982
The Hill:KL:63:2972
Aliens:HK:532:4892
Star Wars:HK:301:4102
A Few Good Men:KL:445:5851
Toy Story:HK:239:3972
Aliens:HK:532:4892
使用- u选项去除重复行,不必加其他选项, s o r t会自动处理。
代码:
$ sort -u video.txt
A Few Good Men:KL:445:5851
Alien:HK:119:1982
Aliens:HK:532:4892
Boys in Company C:HK:192:2192
Star Wars:HK:301:4102
The Hill:KL:63:2972
Toy Story:HK:239:3972
使用k的其他sort方法
s o r t还有另外一些方法指定分类键。可以指定k选项,第1域(分类键)以1开始。不要与前面相混淆。其他选项也可以使用k,主要用于指定分类域开始的字符数目。
使用- k 4,按年租金分类的次序。
代码:
$ sort -t: -k4 video.txt
A alien:HK:119:1982
Alien:HK:119:1982
Boys in Company C:HK:192:2192
A the Hill:KL:63:2972
The Hill:KL:63:2972
Toy Story:HK:239:3972
Star Wars:HK:301:4102
Aliens:HK:532:4892
Aliens:HK:532:4892
A Few Good Men:KL:445:5851
用k做分类键排序
可以指定分类键次序。先以第4域,再以第1域分类,命令为-k4 -k1,也可以反过来,以便在文件首行显示最高年租金,方法如下:
代码:
$ sort -t: -k4 -k1 video.txt
AAlien:HK:119:1982
Alien:HK:119:1982
Boys in Company C:HK:192:2192
The Hill:KL:63:2972
Toy Story:HK:239:3972
Star Wars:HK:301:4102
Aliens:HK:532:4892
A Few Good Men:KL:445:5851
代码:
$ sort -t: -k4 -k1 -r video.txt
A Few Good Men:KL:445:5851
Aliens:HK:532:4892
Star Wars:HK:301:4102
Toy Story:HK:239:3972
The Hill:KL:63:2972
Boys in Company C:HK:192:2192
Alien:HK:119:1982
AAlien:HK:119:1982
这里-r是对第四域反排序?
代码:
$ sort -t: -k1 video.txt
AAlien:HK:119:1982
A Few Good Men:KL:445:5851
Alien:HK:119:1982
Aliens:HK:532:4892
Boys in Company C:HK:192:2192
Star Wars:HK:301:4102
The Hill:KL:63:2972
Toy Story:HK:239:3972
代码:
$ sort -t: -k1 -k4 video.txt
AAlien:HK:119:1982
A Few Good Men:KL:445:5851
Alien:HK:119:1982
Aliens:HK:532:4892
Boys in Company C:HK:192:2192
Star Wars:HK:301:4102
The Hill:KL:63:2972
Toy Story:HK:239:3972
代码:
$ sort -t: -k1 -k4 -r video.txt
Toy Story:HK:239:3972
The Hill:KL:63:2972
Star Wars:HK:301:4102
Boys in Company C:HK:192:2192
Aliens:HK:532:4892
Alien:HK:119:1982
A Few Good Men:KL:445:5851
AAlien:HK:119:1982
对第一域进行反排序?
换成第3域
代码:
$ sort -t: +2nr -k1 -r video.txt
Aliens:HK:532:4892
A Few Good Men:KL:445:5851
Star Wars:HK:301:4102
Toy Story:HK:239:3972
Boys in Company C:HK:192:2192
Alien:HK:119:1982
AAlien:HK:119:1982
The Hill:KL:63:2972
对第三域进行倒序,再对第一域排序,最后把第一域倒序?
代码:
$ sort -t: +2nr -k1 video.txt
Aliens:HK:532:4892
A Few Good Men:KL:445:5851
Star Wars:HK:301:4102
Toy Story:HK:239:3972
Boys in Company C:HK:192:2192
AAlien:HK:119:1982
Alien:HK:119:1982
The Hill:KL:63:2972
指定sort序列
可以指定分类键顺序,也可以使用- n选项指定不使用哪个分类键进行查询。看下面的s o r t命令:
代码:
$ sort +0 -2 +3 video.txt
该命令意即开始以域0分类,忽略域2,然后再使用域3分类。
pos用法
指定开始分类的域位置的另一种方法是使用如下格式:
代码:
sort +field_number.characters_in
意即从f i e l d _ n u m b e r开始分类,但是要在此域的第c h a r a c t e r s _ i n个字符开始。
如:
代码:
$ cat video.txt
Boys in Company C:HK48:192:2192
Alien:HK57:119:1982
The Hill:KL223:63:2972
Aliens:HK11:532:4892
Star Wars:HK38:301:4102
A Few Good Men:KL87:445:5851
Toy Story:HK65:239:3972
要只使用供应区代码后缀部分将文件分类,其命令为+ 1 . 2,意即以第1域最左边第3个字符开始分类
代码:
$ sort -t: +1.2 video.txt
Aliens:HK11:532:4892
The Hill:KL223:63:2972
Star Wars:HK38:301:4102
Boys in Company C:HK48:192:2192
Alien:HK57:119:1982
Toy Story:HK65:239:3972
A Few Good Men:KL87:445:5851
比较一下加n,呵呵,其实区码并不需要加n
代码:
$ sort -t: +1.2n video.txt
Aliens:HK11:532:4892
Star Wars:HK38:301:4102
Boys in Company C:HK48:192:2192
Alien:HK57:119:1982
Toy Story:HK65:239:3972
A Few Good Men:KL87:445:5851
使用head和tail将输出分类
分类操作时,不一定要显示整个文件或一页以查看s o r t结果中的第一和最后一行。如果只显示最高年租金,按第4域分类- k 4并求逆,然后使用管道只显示s o r t输出的第一行,此命令为h e a d,可以指定查阅行数。如果只有第一行,则为head -1:
代码:
$ sort -t: -k4r video.txt
A Few Good Men:KL87:445:5851
Aliens:HK11:532:4892
Star Wars:HK38:301:4102
Toy Story:HK65:239:3972
The Hill:KL223:63:2972
Boys in Company C:HK48:192:2192
Alien:HK57:119:1982
代码:
$ sort -t: -k4r video.txt | head -1
A Few Good Men:KL87:445:5851
代码:
$ sort -t: -k4r video.txt | head -2
A Few Good Men:KL87:445:5851
Aliens:HK11:532:4892
要查阅最低年租金,使用t a i l命令与h e a d命令刚好相反,它显示文件倒数几行。1为倒数一行,2为倒数两行等等。查阅最后一行为tail -1。结合上述的s o r t命令和t a i l命令显示最低年租金:
代码:
$ sort -t: -k4r video.txt | tail -1
Alien:HK57:119:1982
代码:
$ sort -t: -k4r video.txt | tail -2
Boys in Company C:HK48:192:2192
Alien:HK57:119:1982
可以使用h e a d或t a i l查阅任何大的文本文件, h e a d用来查阅文件头,基本格式如下:
代码:
head [how_many_lines_to_display] file_name
Ta i l用来查阅文件尾,基本格式为:
代码:
tail [how_many_lines_to_display] file_name
如果使用h e a d或t a i l时想省略显示行数,缺省时显示1 0行。
要查阅文件前2 0行:
代码:
$ head -20 passwd
要查阅文件后10行:
代码:
$ tail -10 passwd
awk使用sort输出结果
对数据分类时,对s o r t结果加一点附加信息很有必要,对其他用户尤其如此。使用a w k可以轻松完成这一功能。比如说采用上面最低租金的例子,需要将s o r t结果管道输出到a w k,不要忘了用冒号作域分隔符,显示提示信息和实际数据。
代码:
$3}'
Worst rental Alien has been rented119
将两个分类文件合并
将文件合并前,它们必须已被分类。合并文件可用于事务处理和任何种类的修改操作。
下面这个例子,因为忘了把两个家电名称加入文件,它们被放在一个单独的文件里,现在将之并入一个文件。分类的合并格式为‘ sort -m sorted_file1 sorted_file2,下面是包含两个新家电名称的文件列表,它已经分类完毕:
代码:
$ cat video2.txt
Crimson Tide:134:2031
Die Hard:152:2981
使用-m +o。将这个文件并入已存在的分类文件v i d e o . s o r t,要以名称域进行分类,实际上没有必要加入+ o,但为了保险起见,还是加上的好。
代码:
$ sort -t: -m +0 video2.txt video.txt
Boys in Company C:HK48:192:2192
Alien:HK57:119:1982
Crimson Tide:134:2031
Die Hard:152:2981
The Hill:KL223:63:2972
Aliens:HK11:532:4892
Star Wars:HK38:301:4102
A Few Good Men:KL87:445:5851
Toy Story:HK65:239:3972
系统sort
s o r t可以用来对/ e t c / p a s s w d文件中用户名进行分类。这里需要以第1域即注册用户名分类,然后管道输出结果到a w k,a w k打印第一域。
代码:
$1}'
adm
apache
bin
chenwy
daemon
desktop
.......
s o r t还可以用于d f命令,以递减顺序打印使用列。下面是一般d f输出。
代码:
$ df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda2 5162828 2289460 2611108 47% /
/dev/sda1 497829 13538 458589 3% /boot
none 99352 0 99352 0% /dev/shm
使用- b选项,忽略分类域前面的空格。使用域4(+ 4),即容量列将分类求逆,最后得出文件系统自由空间的清晰列表。
代码:
$ df | sort -b -r +4
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda2 5162828 2289460 2611108 47% /
/dev/sda1 497829 13538 458589 3% /boot
none 99352 0 99352 0% /dev/shm
在一个文本文件中存入所有I P地址的拷贝,这样查看本机I P地址更容易一些。有时如果管理员权限下,就需要将此文件分类。将I P地址按文件中某种数值次序分类时,需要指定域分隔符为句点。这里只需关心I P地址的最后一段。分类应从此域即域3开始,未分类文件如下:
代码:
$ vi iplist
$ cat iplist
193.132.80.123 dave tansley
193.132.80.23 HP printer 2nd floor
193.132.80.198 JJ. Peter's scanner
193.132.80.38 SPARE
193.132.80.78 P.Edron
分类后结果如下:
代码:
$ sort -t. +3n iplist
193.132.80.23 HP printer 2nd floor
193.132.80.38 SPARE
193.132.80.78 P.Edron
193.132.80.123 dave tansley
193.132.80.198 JJ. Peter's scanner
uniq用法
u n i q用来从一个文本文件中去除或禁止重复行。一般u n i q假定文件已分类,并且结果正确。
我们并不强制要求这样做,如果愿意,可以使用任何非排序文本,甚至是无规律行。
可以认为u n i q有点像s o r t命令中唯一性选项。对,在某种程度上讲正是如此,但两者有一个重要区别。s o r t的唯一性选项去除所有重复行,而u n i q命令并不这样做。重复行是什么?在u n i q里意即持续不断重复出现的行,中间不夹杂任何其他文本,现举例如下:
代码:
$ cat myfile.txt
May Day
May Day
May Day
Going DOwn
May Day
May Day.
May Day
u n i q将前三个May Day看作重复副本,但是因为第4行有不同的文本,故并不认为第五行持续的May Day为其副本。u n i q将保留这一行。
命令一般格式:
代码:
$uniq -u d c -f input-file out-file
引用:
其选项含义:
-u 只显示不重复行。
-d 只显示有重复数据行,每种重复行只显示其中一行
-c 打印每一重复行出现次数。
-f n为数字,前n个域被忽略。
一些系统不识别- f选项,这时替代使用- n。
创建文件m y f i l e . t x t,在此文件上运行u n i q命令。
代码:
$ uniq myfile.txt
May Day
Going DOwn
May Day
May Day.
May Day
注意第5行保留下来,其文本为最后一行May Day。如果运行sort -u,将只返回May Day和Going Down。
连续重复出现
使用- c选项显示行数,即每个重复行数目。本例中,行May Day重复出现三次
代码:
$ uniq -c myfile.txt
3 May Day
1 Going DOwn
1 May Day
1 May Day.
1 May Day
1. 不唯一
使用- d显示重复出现的不唯一行:
代码:
$ uniq -d myfile.txt
May Day
代码:
$ uniq -u myfile.txt
Going DOwn
May Day
May Day.
2. 对特定域进行测试
使用- n只测试一行一部分的唯一性。例如- 5意即测试第5域后各域唯一性。域从1开始记数。
如果忽略第1域,只测试第2域唯一性,使用- n2,下述文件包含一组数据,其中第2域代表组代码。
代码:
$ cat parts.txt
AK123 OPP Y13
DK122 OPP Y24
EK999 OPP M2
代码:
$ cat parts.txt
AK123 33 46 6u OPP ty yu
DK122 5h 67 y8 OPP ty yu
EK999 56 56 78 IIY ty yu
运行u n i q,将返回所有行。因为这个文件每一行都不同。
代码:
$ cat parts.txt
1 AK123 33 46 6u OPP ty yu
1 DK122 5h 67 y8 OPP ty yu
1 EK999 56 56 78 IIY ty yu
如果指定测试在第4域后,结果就会不同。u n i q会比较三个相同的O PP,因此将返回一行。
代码:
$ uniq -f4 -c parts.txt
2 AK123 33 46 6u OPP ty yu
1 EK999 56 56 78 IIY ty yu
指定第5域,即从第6域开始比较:
代码:
$ uniq -f5 -c parts.txt
3 AK123 33 46 6u OPP ty yu
如果‘- f'返回错误,替代-n使用:
join用法
j o i n用来将来自两个分类文本文件的行连在一起。
下面讲述j o i n工作方式。这里有两个文件f i l e 1和f i l e 2,当然已经分类。每个文件里都有一些元素与另一个文件相关。由于这种关系, j o i n将两个文件连在一起,这有点像修改一个主文件,使之包含两个文件里的共同元素。
文本文件中的域通常由空格或t a b键分隔,但如果愿意,可以指定其他的域分隔符。一些系统要求使用j o i n时文件域要少于2 0,为公平起见,如果域大于2 0,应使用D B M S系统。
为有效使用j o i n,需分别将输入文件分类。
其一般格式为:
代码:
join [options] input-file1 input-file2
引用:
选项:
an n 为一数字,用于连接时从文件n中显示不匹配行。例如, - a 1显示第一个文件的不匹配行,- a 2为从第二个文件中显示不匹配行。
o n.m n为文件号,m为域号。1 . 3表示只显示文件1第三域,每个n,m必须用逗号分隔,如1 . 3,2 . 1。
j n m n为文件号,m为域号。使用其他域做连接域。
t 域分隔符。用来设置非空格或t a b键的域分隔符。例如,指定冒号做域分隔符- t:。
现有两个文本文件,其中一个包含名字和街道地址,称为n a m e . t x t,另一个是名字和城镇,
为t o w n . t x t。
代码:
$ cat names.txt
M.Golls 12 Hidd Rd
P.Heller The Acre
P.Willey 132 The Grove
T.Norms 84 Connaught Rd
K.Fletch 12 Woodlea
代码:
$ cat town.txt
M.Golls Norwich NRD
P.Willey Galashiels GDD
T.Norms Brandon BSL
K.Fletch Mildenhall MAF
K.Firt Mitryl Mdt
连接两个文件
连接两个文件,使得名字支持详细地址。例如M . G o l l s记录指出地址为12 Hidd Rd。连接域为域0—名字域。因为两个文件此域相同, j o i n将假定这是连接域:
代码:
$ join names.txt town.txt
M.Golls 12 Hidd Rd Norwich NRD
P.Willey 132 The Grove Galashiels GDD
T.Norms 84 Connaught Rd Brandon BSL
K.Fletch 12 Woodlea Mildenhall MAF
缺省j o i n删除或去除连接键的第二次重复出现,这里即为名字域。
1. 不匹配连接
如果一个文件与另一个文件没有匹配域时怎么办?这时j o i n不可以没有参数选项,经常指定两个文件的- a选项。下面的例子显示匹配及不匹配域。
代码:
$ join -a1 -a2 names.txt town.txt
M.Golls 12 Hidd Rd Norwich NRD
P.Heller The Acre
P.Willey 132 The Grove Galashiels GDD
T.Norms 84 Connaught Rd Brandon BSL
K.Fletch 12 Woodlea Mildenhall MAF
K.Firt Mitryl Mdt
代码:
$ join -a1 names.txt town.txt
M.Golls 12 Hidd Rd Norwich NRD
P.Heller The Acre
P.Willey 132 The Grove Galashiels GDD
T.Norms 84 Connaught Rd Brandon BSL
K.Fletch 12 Woodlea Mildenhall MAF
2. 选择性连接
使用- o选项选择连接域。例如要创建一个文件仅包含人名及城镇, j o i n执行时需要指定显示域。方式如下:
使用1 . 1显示第一个文件第一个域,2 . 2显示第二个文件第二个域,其间用逗号分隔。命令为:
代码:
$ join -o 1.1,2.2 names.txt town.txt
M.Golls Norwich
P.Willey Galashiels
T.Norms Brandon
K.Fletch Mildenhall
使用-jn m进行其他域连接,例如用文件1域3和文件域2做连接键,命令为:
代码:
$ cat pers
P.Jones Office Runner ID897
S.Round UNIX admin ID666
L.Clip Personl Chief ID982
代码:
$ cat pers2
Dept2C ID897 6 years
Dept3S ID666 2 years
Dept5Z ID982 1 year
文件p e r s包括名字、工作性质和个人I D号。文件p e r s 2包括部门、个人I D号及工龄。连接应使用文件p e r s中域4,匹配文件p e r s 2中域2,命令及结果如下:
代码:
$ join -j1 4 -j2 2 pers pers2
ID897 P.Jones Office Runner Dept2C 6 years
ID666 S.Round UNIX admin Dept3S 2 years
ID982 L.Clip Personl Chief Dept5Z 1 year
$4}'文件名,观察其是否匹配假想域。
cut用法
c u t用来从标准输入或文本文件中剪切列或域。剪切文本可以将之粘贴到一个文本文件。
c u t一般格式为:
代码:
cut [options] file1 file2
引用:
下面介绍其可用选项:
-c list 指定剪切字符数。
-f field 指定剪切域数。
-d 指定与空格和t a b键不同的域分隔符。
- c用来指定剪切范围,如下所示:
- c 1,5-7 剪切第1个字符,然后是第5到第7个字符。
-c1-50 剪切前5 0个字符。
-f 格式与- c相同。
-f 1,5 剪切第1域,第5域。
- f 1,10-12 剪切第1域,第1 0域到第1 2域。
现在从' p e r s '文件中剪切文本。
代码:
$ cat pers
P.Jones Office Runner ID897
S.Round UNIX admin ID666
L.Clip Personl Chief ID982
使用域分隔符
文件中使用空格“ ”为域分隔符,故可用- d选项指定冒号,如- d " "。如果有意观察第3域,可以使用- f 3。要抽取I D域。可使用命令如下:
代码:
$ cut -d" " -f3 pers
Runner
admin
Chief
剪切指定域
c u t命令中剪切各域需用逗号分隔,如剪切域1和3,即名字和I D号,可以使用:
代码:
$ cut -d" " -f1,3 pers
P.Jones Runner
S.Round admin
L.Clip Chief
使用- c选项指定精确剪切数目
这种方法需确切知道开始及结束字符。通常我不用这种方法,除非在固定长度的域或文件名上。
当信息文件传送到本机时,查看部分文件名就可以识别文件来源。要得到这条信息需抽取文件名后三个字符。然后才决定将之存在哪个目录下。下面的例子显示文件名列表及相应c u t命令:
代码:
$ cat pers2
Dept2C ID897 6 years
Dept3S ID666 2 years
Dept5Z ID982 1 year
代码:
$ cut -c4-8,11-12 pers2
t2C I97
t3S I66
t5Z I82
要剪切谁正在使用系统的用户信息,方法如下:
代码:
$ who -u|cut -c1-8
root
root
paste用法
c u t用来从文本文件或标准输出中抽取数据列或者域,然后再用p a s t e可以将这些数据粘贴起来形成相关文件。粘贴两个不同来源的数据时,首先需将其分类,并确保两个文件行数相同。
p a s t e将按行将不同文件行信息放在一行。缺省情况下, p a s t e连接时,用空格或t a b键分隔新行中不同文本,除非指定- d选项,它将成为域分隔符。
p a s t e格式为;
代码:
paste -d -s -file1 file2
引用:
选项含义如下:
-d 指定不同于空格或t a b键的域分隔符。例如用@分隔域,使用- d @。
-s 将每个文件合并成行而不是按行粘贴。
- 使用标准输入。例如ls -l |paste ,意即只在一列上显示输出。
从前面的剪切中取得下述两个文件:
代码:
$ cut -d" " -f 2 pers2 >pas1
$ cat pas1
ID897
ID666
ID982
代码:
$ cut -d" " -f1 pers >pas2
$ cat pas2
P.Jones
S.Round
L.Clip
基本p a s t e命令将之粘贴成两列:
代码:
$ paste pas1 pas2
ID897 P.Jones
ID666 S.Round
ID982 L.Clip
指定列
通过交换文件名即可指定哪一列先粘:
代码:
$ paste pas2 pas1
P.Jones ID897
S.Round ID666
L.Clip ID982
使用不同的域分隔符
要创建不同于空格或t a b键的域分隔符,使用- d选项。下面的例子用冒号做域分隔符。
代码:
$ paste -d: pas2 pas1
P.Jones:ID897
S.Round:ID666
L.Clip:ID982
要合并两行,而不是按行粘贴,可以使用- s选项。下面的例子中,第一行粘贴为名字,第二行是I D号。
代码:
$ paste -s pas2 pas1
P.Jones S.Round L.Clip
ID897 ID666 ID982
paste命令管道输入
p a s t e命令还有一个很有用的选项( -)。意即对每一个( -),从标准输入中读一次数据。
使用空格作域分隔符,以一个4列格式显示目录列表。方法如下:
代码:
$ ls | paste -d" " - - - - -
1.bak 1.txt append.sed backll.ee change.sed
data.f data.txt delete_me_and_die dht dir1
......................
一行显示四个文件,以空格分开
代码:
$ ls | paste -d: - - - - -
1.bak:1.txt:append.sed:backll.ee:change.sed
data.f:data.txt:delete_me_and_die:dht:dir1
.....................
一行显示四个文件,以冒号:分开
也可以以一列格式显示输出:
代码:
$ ls | paste -d" " -
1.bak
1.txt
append.sed
backll.ee
..................
一行显示一个文件
split用法
s p l i t用来将大文件分割成小文件。有时文件越来越大,传送这些文件时,首先将其分割可能更容易。使用v i或其他工具诸如s o r t时,如果文件对于工作缓冲区太大,也会存在一些问题。
因此有时没有选择余地,必须将文件分割成小的碎片。
s p l i t命令一般格式:
代码:
split -output_file-size input-filename output-filename
这里o u t p u t - f i l e - s i z e指的是文本文件被分割的行数。
s p l i t查看文件时,o u t p u t - f i l e - s i z e选项指定将文件按每个最多1 0 0 0行分割。如果有个文件有38行,那么将分割成3个文件,分别有
10、10、10、8行。每个文件格式为x [ a a ]到x [ z z ],x为文件名首字母, [ a a ]、[ z z ]为文件名剩余部分顺序字符组合,下面的例子解释这一点。
如passwd有38行:
代码:
$ ls -l
总用量 8
-rw-r--r-- 1 sam sam 1649 12月 4 11:13 passwd
-rw-rw-r-- 1 sam sam 84 12月 4 11:19 split1
代码:
$ split -10 passwd
$ ls -l
总用量 24
-rw-r--r-- 1 sam sam 1649 12月 4 11:13 passwd
-rw-rw-r-- 1 sam sam 84 12月 4 11:19 split1
-rw-rw-r-- 1 sam sam 368 12月 4 11:24 xaa
-rw-rw-r-- 1 sam sam 474 12月 4 11:24 xab
-rw-rw-r-- 1 sam sam 495 12月 4 11:24 xac
-rw-rw-r-- 1 sam sam 312 12月 4 11:24 xad
生成了四个文件,前三个文件每个文件10行,最后一个8行,分割分的文件名自动产生,格式为x[a-a][z-z]
再如split有6行:
代码:
$ cat split1
this is line1
this is line2
this is line3
this is line4
this is line5
this is line6
按每个文件1行分割,命令为:
代码:
$ split -1 split1
$ ls -l
总用量 32
-rw-r--r-- 1 sam sam 1649 12月 4 11:13 passwd
-rw-rw-r-- 1 sam sam 84 12月 4 11:19 split1
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xaa
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xab
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xac
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xad
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xae
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xaf
文件有6行,s p l i t按每个文件1行进行了分割,并按字母顺序命名文件。为进一步确信操作成功,观察一个新文件内容:
代码:
$ cat xaa
this is line1
$ cat xaf
this is line6
使用 head 和 tail 以块方式读取文本流
没实践过,有兴趣的自己试试
假定您想只处理文件的一部分,譬如头几行或后几行,那您该怎么做呢?请使用 head(它将头 10 行发送至标准输出)或 tail(它将后 10 行发送至标准输出)。
您可以通过使用 -n 选项改变这些命令发送至其标准输出的行数(当然,输出结果将随 XF86Config 文件的内容而不同):
清单 1. 将 XF86Config 中选定行数的内容发送至标准输出
代码:
$ head -n 4 /etc/X11/XF86Config
引用:
# File generated by anaconda.
# **********************************************************************
# Refer to the XF86Config(4/5) man page for details about the format of
# this file.
代码:
$ tail -n 4 /etc/X11/XF86Config
引用:
Modes "1600x1200"
ViewPort 0 0
EndSubsection
EndSection
如果您想让 head 或 tail 以字节而不是以行为单位 ,那该怎么办呢?您可以用 -c 选项代替 -n 选项。因此,要显示前 200 个字符,请使用
代码:
head -c 200 file
或者使用
代码:
tail -c 200 file
来显示后 200 个字符。如果数字后面跟有 b(表示块(block)),那么这个数字将被乘以 512。类似地,跟有 k(表示千字节(kilobyte))表示用 1024 去乘给定的数字,而跟有 m(表示兆字节(megabyte))表示用 1048576 字节去乘给定的数字。
请记住,
代码:
head file1 file2 file3
和
代码:
cat file1 file2 file3 | head
之间有重大差别。前者将打印每个文件指定行数的内容,不同文件的内容之间用头信息隔开,头信息以 ==> 后跟文件名开头。
后者将打印由 cat 命令后所列文件组成的输入流中指定行数的内容,但将把输入流作为单个文件对待。
可以使用 -q(表示静默(quiet))选项关闭文件名头信息。与 -q 相反的是 -v(表示详列(verbose))。
假如您要处理的文件在处理期间一直在发生变化(比如,当您让 head 或 tail 读取来自正在被另一个命令写入的文件的数据时,就是这种情况),请使用 -f 选项让 tail 持续读取来自指定文件的数据并将这些数据发送至 tail 自己的标准输出中。通过管道发送数据时该选项会被忽略。因此,cat file | tail -f 将不会得到所期望的结果,但 tail -f file 则可以。
(如果 tail 正在读取的文件不止一个,那么各行内容之间将用标准头信息隔开,以指明它们来自哪个文件,标准头信息以 ==> 开头。)
这个选项用于监视系统日志再合适不过,譬如,在单独的终端窗口(或单独的控制台)中执行的 tail -f /var/log/access.log 将持续打印每次点击后新添加的 Apache 访问日志条目,一直到您用 Ctrl-C 停止它为止。
通过组合使用 head 和 tail,可以从文件的中间部分读取给定长度的一块数据!下面说明如何做到:假定您想从文件开头算起第 1000 字节处开始读取一块 789 字节的数据。可以使用
代码:
cat file | head -c 1788 | tail -c 789
来解决这一问题。
使用 tac 命令逆序排序文件
如果您想对文件中的各行进行逆序排序,该怎么做呢?这就要用到 tac 命令。(请注意,tac 由 cat 逆序拼写而成。)该命令对所列出的文件中的各行或各段进行逆序排序。
该命令不能逆序排序各文件的顺序 — 这个任务您得自己做,以逆向顺序在 tac 命令后列出各文件即可。作为说明 tac 的工作原理的示例,对一些文件使用 ls -l | tail 和 ls -l | tail | tac,比较其结果。
代码:
$ ls -l |tail
总用量 32
-rw-r--r-- 1 sam sam 1649 12月 4 11:13 passwd
-rw-rw-r-- 1 sam sam 84 12月 4 11:19 split1
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xaa
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xab
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xac
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xad
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xae
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xaf
正序
代码:
$ ls -l |tail | tac
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xaf
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xae
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xad
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xac
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xab
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xaa
-rw-rw-r-- 1 sam sam 84 12月 4 11:19 split1
-rw-r--r-- 1 sam sam 1649 12月 4 11:13 passwd
倒序
代码:
$ tac split1
this is line6
this is line5
this is line4
this is line3
this is line2
this is line1
对文件操作
......
显示全文...
补课--linux中软盘的使用
标签: 类UNIX系统, LINUX学习 0 评论
前两天去面试,做了一份试卷,就一道题没答出来,那张卷子的第一道题,“linux下怎么挂载软盘“
后面其它的写脚本什么的都搞定了,就这一个卡了,面试的时候那个对我说,你用linux那么久了,怎么挂载软盘怎么不答不出来呢?当时那叫一个汗呀。
俺用挂载过硬盘,光驱,磁带机,移动设备。说真的,还真从来没在linux下挂载过软盘。其实mount格式就是样的,主要是软盘的那个设备文件叫什么名字记不得了。
知耻后勇,现在补上吧:
1。Mounting Floppy Disks
Must be manually mounted and unmounted
mount /dev/fd0 /media/floppy
umount /media/floppy
2。Formattiong Floppy Disks
Two types of format needed to prepare a floppy:
Alow levelformat: fdformat /dev/df0H1440
A filesystem,one of
mkfs -t ext2 /dev/fd0
mke2fd /dev/fd0
mkfd -t vfat /dev/fd0
3。使用tar备份文件到未格式化的软盘
Floppeds can used like tape drives
low level format required
File system not needed
Floppy cannot be mounted
Use tar to write to the floppy
/dev/fd0 ks the destination
备份时按如下方法:
#unount /media/floppy (卸载)
#fdformat /dev/fd0H1440 (低格)
#tar cvfM /dev/fd0 file (其中"file"表示要备份的文件,M表示分片写入,当第一片写完后就会提示放入
第二片)
还原:
#tar xvfM /dev/fd0
如果有多片磁盘,在第一片还原完毕后会提示放入每二片。
......
显示全文...
RHEL笔记__sort用法
标签: 类UNIX系统, LINUX学习 0 评论
引用:
• 实用的分类(s o r t)操作。
• uniq。
• join。
• cut。
• paste。
• split。
sort用法
s o r t命令选项很长,下面仅介绍各种选项。
选项
s o r t命令的一般格式为:
代码:
sort -cmu -o output_file [other options] +pos1 +pos2 input_files
下面简要介绍一下s o r t的参数:
引用:
-c 测试文件是否已经分类。
-m 合并两个分类文件。
-u 删除所有复制行。
-o 存储s o r t结果的输出文件名。
其他选项有:
引用:
-b 使用域进行分类时,忽略第一个空格。
-n 指定分类是域上的数字分类。
-t 域分隔符;用非空格或t a b键分隔域。
-r 对分类次序或比较求逆。
+n n为域号。使用此域号开始分类。
n n为域号。在分类比较时忽略此域,一般与+ n一起使用。
post1 传递到m,n。m为域号,n为开始分类字符数;例如4,6意即以第5域分类,从第7个字符开始。
保存输出
- o选项保存分类结果,然而也可以使用重定向方法保存。下面例子保存结果到r e s u l t s . o u t:
代码:
$sort video.txt >results.out
启动方式
缺省情况下, s o r t认为一个空格或一系列空格为分隔符。要加入其他方式分隔,使用- t选s o r t执行时,先查看是否为域分隔设置了- t选项,如果设置了,则使用它来将记录分隔成域0、域1等等
;如果未设置,用空格代替。缺省时s o r t将整个行排序,指定域号的情况例外。
下面是文件v i d e o . t x t的清单,包含了上个季度家电商场的租金情况。各域为:(1)名称,(2)供货区代码,(3)本季度租金,(4)本年租金。域分隔符为冒号。为此对此例需使用‘ - t'选项。文件如下:
代码:
$ cat video.txt
Boys in Company C:HK:192:2192
Alien:HK:119:1982
The Hill:KL:63:2972
Aliens:HK:532:4892
Star Wars:HK:301:4102
A Few Good Men:KL:445:5851
Toy Story:HK:239:3972
sort对域的参照方式
关于s o r t的一个重要事实是它参照第一个域作为域0,域1是第二个域,等等。s o r t也可以使用整行作为分类依据。
文件是否已分类
怎样分辨文件是否已分类?如果只有3 0行,看看就知道了,但如果是4 0 0行呢,使用s o r t - c通知s o r t文件是否按某种顺序分类。
代码:
$ sort -c video.txt
sort: video.txt:2: disorder: Alien:HK:119:1982
结果显示未分类,
现在将之分类,再试一次:
代码:
$ sort -t: video.txt >video2.txt
$ sort -c video2.txt
$
返回提示符表明已分类。然而如果测试成功,返回一个信息行会更好。
基本sort
最基本的s o r t方式为sort filename,按第一域进行分类(分类键0)。实际上读文件时s o r t操作将行中各域进行比较,这里返回基于第一域s o r t的结果
代码:
$ sort -t: video.txt
A Few Good Men:KL:445:5851
Alien:HK:119:1982
Aliens:HK:532:4892
Boys in Company C:HK:192:2192
Star Wars:HK:301:4102
The Hill:KL:63:2972
Toy Story:HK:239:3972
sort分类求逆
如果要逆向s o r t结果,使用- r选项。在通读大的注册文件时,使用逆向s o r t很方便。下面是按域0分类的逆向结果。
代码:
$ sort -t: -r video.txt
Toy Story:HK:239:3972
The Hill:KL:63:2972
Star Wars:HK:301:4102
Boys in Company C:HK:192:2192
Aliens:HK:532:4892
Alien:HK:119:1982
A Few Good Men:KL:445:5851
按指定域分类
有时需要只按第2域(分类键1)分类。这里为重排报文中供应区代码,使用t 1,意义为按分类键1分类。下面的例子中,所有供应区代码按分类键1分类;注意分类键2和3对应各域也被分类。
代码:
$ sort -t: +1 video.txt
Alien:HK:119:1982
Boys in Company C:HK:192:2192
Toy Story:HK:239:3972
Star Wars:HK:301:4102
Aliens:HK:532:4892
A Few Good Men:KL:445:5851
The Hill:KL:63:2972
前几个第二域都是HK,第三域:119,192,301,489,532,63,按第一个数字分了,因此必须指定多域及数值域
数值域分类
依此类推,要按第三分类键分类,使用t 3。但是因为这是数值域,即为数值分类,可以使用- n选项。下面例子为按年租金分类命令及结果:
代码:
$ sort -t: +3n video.txt
Alien:HK:119:1982
Boys in Company C:HK:192:2192
The Hill:KL:63:2972
Toy Story:HK:239:3972
Star Wars:HK:301:4102
Aliens:HK:532:4892
A Few Good Men:KL:445:5851
如果不指定n,如下
代码:
$ sort -t: +2 video.txt
Alien:HK:119:1982
Boys in Company C:HK:192:2192
Toy Story:HK:239:3972
Star Wars:HK:301:4102
A Few Good Men:KL:445:5851
Aliens:HK:532:4892
The Hill:KL:63:2972
o r t只查看第3域每个数值的第一个数,并按其分类,然后再按第二个数依次下去。
代码:
$ sort -t: +2n video.txt
The Hill:KL:63:2972
Alien:HK:119:1982
Boys in Company C:HK:192:2192
Toy Story:HK:239:3972
Star Wars:HK:301:4102
A Few Good Men:KL:445:5851
Aliens:HK:532:4892
数值域倒序:
代码:
$ sort -t: +2nr video.txt
Aliens:HK:532:4892
A Few Good Men:KL:445:5851
Star Wars:HK:301:4102
Toy Story:HK:239:3972
Boys in Company C:HK:192:2192
Alien:HK:119:1982
The Hill:KL:63:2972
唯一性分类
有时,原文件中有重复行,这时可以使用- u选项进行唯一性(不重复)分类以去除重复行,本例中A l i e n有相同的两行。带重复行的文件如下,其中A l i e n插入了两次:
代码:
$ echo "Aliens:HK:532:4892" >> video.txt
$ cat video.txt
Boys in Company C:HK:192:2192
Alien:HK:119:1982
The Hill:KL:63:2972
Aliens:HK:532:4892
Star Wars:HK:301:4102
A Few Good Men:KL:445:5851
Toy Story:HK:239:3972
Aliens:HK:532:4892
使用- u选项去除重复行,不必加其他选项, s o r t会自动处理。
代码:
$ sort -u video.txt
A Few Good Men:KL:445:5851
Alien:HK:119:1982
Aliens:HK:532:4892
Boys in Company C:HK:192:2192
Star Wars:HK:301:4102
The Hill:KL:63:2972
Toy Story:HK:239:3972
使用k的其他sort方法
s o r t还有另外一些方法指定分类键。可以指定k选项,第1域(分类键)以1开始。不要与前面相混淆。其他选项也可以使用k,主要用于指定分类域开始的字符数目。
使用- k 4,按年租金分类的次序。
代码:
$ sort -t: -k4 video.txt
A alien:HK:119:1982
Alien:HK:119:1982
Boys in Company C:HK:192:2192
A the Hill:KL:63:2972
The Hill:KL:63:2972
Toy Story:HK:239:3972
Star Wars:HK:301:4102
Aliens:HK:532:4892
Aliens:HK:532:4892
A Few Good Men:KL:445:5851
用k做分类键排序
可以指定分类键次序。先以第4域,再以第1域分类,命令为-k4 -k1,也可以反过来,以便在文件首行显示最高年租金,方法如下:
代码:
$ sort -t: -k4 -k1 video.txt
AAlien:HK:119:1982
Alien:HK:119:1982
Boys in Company C:HK:192:2192
The Hill:KL:63:2972
Toy Story:HK:239:3972
Star Wars:HK:301:4102
Aliens:HK:532:4892
A Few Good Men:KL:445:5851
代码:
$ sort -t: -k4 -k1 -r video.txt
A Few Good Men:KL:445:5851
Aliens:HK:532:4892
Star Wars:HK:301:4102
Toy Story:HK:239:3972
The Hill:KL:63:2972
Boys in Company C:HK:192:2192
Alien:HK:119:1982
AAlien:HK:119:1982
这里-r是对第四域反排序?
代码:
$ sort -t: -k1 video.txt
AAlien:HK:119:1982
A Few Good Men:KL:445:5851
Alien:HK:119:1982
Aliens:HK:532:4892
Boys in Company C:HK:192:2192
Star Wars:HK:301:4102
The Hill:KL:63:2972
Toy Story:HK:239:3972
代码:
$ sort -t: -k1 -k4 video.txt
AAlien:HK:119:1982
A Few Good Men:KL:445:5851
Alien:HK:119:1982
Aliens:HK:532:4892
Boys in Company C:HK:192:2192
Star Wars:HK:301:4102
The Hill:KL:63:2972
Toy Story:HK:239:3972
代码:
$ sort -t: -k1 -k4 -r video.txt
Toy Story:HK:239:3972
The Hill:KL:63:2972
Star Wars:HK:301:4102
Boys in Company C:HK:192:2192
Aliens:HK:532:4892
Alien:HK:119:1982
A Few Good Men:KL:445:5851
AAlien:HK:119:1982
对第一域进行反排序?
换成第3域
代码:
$ sort -t: +2nr -k1 -r video.txt
Aliens:HK:532:4892
A Few Good Men:KL:445:5851
Star Wars:HK:301:4102
Toy Story:HK:239:3972
Boys in Company C:HK:192:2192
Alien:HK:119:1982
AAlien:HK:119:1982
The Hill:KL:63:2972
对第三域进行倒序,再对第一域排序,最后把第一域倒序?
代码:
$ sort -t: +2nr -k1 video.txt
Aliens:HK:532:4892
A Few Good Men:KL:445:5851
Star Wars:HK:301:4102
Toy Story:HK:239:3972
Boys in Company C:HK:192:2192
AAlien:HK:119:1982
Alien:HK:119:1982
The Hill:KL:63:2972
指定sort序列
可以指定分类键顺序,也可以使用- n选项指定不使用哪个分类键进行查询。看下面的s o r t命令:
代码:
$ sort +0 -2 +3 video.txt
该命令意即开始以域0分类,忽略域2,然后再使用域3分类。
pos用法
指定开始分类的域位置的另一种方法是使用如下格式:
代码:
sort +field_number.characters_in
意即从f i e l d _ n u m b e r开始分类,但是要在此域的第c h a r a c t e r s _ i n个字符开始。
如:
代码:
$ cat video.txt
Boys in Company C:HK48:192:2192
Alien:HK57:119:1982
The Hill:KL223:63:2972
Aliens:HK11:532:4892
Star Wars:HK38:301:4102
A Few Good Men:KL87:445:5851
Toy Story:HK65:239:3972
要只使用供应区代码后缀部分将文件分类,其命令为+ 1 . 2,意即以第1域最左边第3个字符开始分类
代码:
$ sort -t: +1.2 video.txt
Aliens:HK11:532:4892
The Hill:KL223:63:2972
Star Wars:HK38:301:4102
Boys in Company C:HK48:192:2192
Alien:HK57:119:1982
Toy Story:HK65:239:3972
A Few Good Men:KL87:445:5851
比较一下加n,呵呵,其实区码并不需要加n
代码:
$ sort -t: +1.2n video.txt
Aliens:HK11:532:4892
Star Wars:HK38:301:4102
Boys in Company C:HK48:192:2192
Alien:HK57:119:1982
Toy Story:HK65:239:3972
A Few Good Men:KL87:445:5851
使用head和tail将输出分类
分类操作时,不一定要显示整个文件或一页以查看s o r t结果中的第一和最后一行。如果只显示最高年租金,按第4域分类- k 4并求逆,然后使用管道只显示s o r t输出的第一行,此命令为h e a d,可以指定查阅行数。如果只有第一行,则为head -1:
代码:
$ sort -t: -k4r video.txt
A Few Good Men:KL87:445:5851
Aliens:HK11:532:4892
Star Wars:HK38:301:4102
Toy Story:HK65:239:3972
The Hill:KL223:63:2972
Boys in Company C:HK48:192:2192
Alien:HK57:119:1982
代码:
$ sort -t: -k4r video.txt | head -1
A Few Good Men:KL87:445:5851
代码:
$ sort -t: -k4r video.txt | head -2
A Few Good Men:KL87:445:5851
Aliens:HK11:532:4892
要查阅最低年租金,使用t a i l命令与h e a d命令刚好相反,它显示文件倒数几行。1为倒数一行,2为倒数两行等等。查阅最后一行为tail -1。结合上述的s o r t命令和t a i l命令显示最低年租金:
代码:
$ sort -t: -k4r video.txt | tail -1
Alien:HK57:119:1982
代码:
$ sort -t: -k4r video.txt | tail -2
Boys in Company C:HK48:192:2192
Alien:HK57:119:1982
可以使用h e a d或t a i l查阅任何大的文本文件, h e a d用来查阅文件头,基本格式如下:
代码:
head [how_many_lines_to_display] file_name
Ta i l用来查阅文件尾,基本格式为:
代码:
tail [how_many_lines_to_display] file_name
如果使用h e a d或t a i l时想省略显示行数,缺省时显示1 0行。
要查阅文件前2 0行:
代码:
$ head -20 passwd
要查阅文件后10行:
代码:
$ tail -10 passwd
awk使用sort输出结果
对数据分类时,对s o r t结果加一点附加信息很有必要,对其他用户尤其如此。使用a w k可以轻松完成这一功能。比如说采用上面最低租金的例子,需要将s o r t结果管道输出到a w k,不要忘了用冒号作域分隔符,显示提示信息和实际数据。
代码:
$3}'
Worst rental Alien has been rented119
将两个分类文件合并
将文件合并前,它们必须已被分类。合并文件可用于事务处理和任何种类的修改操作。
下面这个例子,因为忘了把两个家电名称加入文件,它们被放在一个单独的文件里,现在将之并入一个文件。分类的合并格式为‘ sort -m sorted_file1 sorted_file2,下面是包含两个新家电名称的文件列表,它已经分类完毕:
代码:
$ cat video2.txt
Crimson Tide:134:2031
Die Hard:152:2981
使用-m +o。将这个文件并入已存在的分类文件v i d e o . s o r t,要以名称域进行分类,实际上没有必要加入+ o,但为了保险起见,还是加上的好。
代码:
$ sort -t: -m +0 video2.txt video.txt
Boys in Company C:HK48:192:2192
Alien:HK57:119:1982
Crimson Tide:134:2031
Die Hard:152:2981
The Hill:KL223:63:2972
Aliens:HK11:532:4892
Star Wars:HK38:301:4102
A Few Good Men:KL87:445:5851
Toy Story:HK65:239:3972
系统sort
s o r t可以用来对/ e t c / p a s s w d文件中用户名进行分类。这里需要以第1域即注册用户名分类,然后管道输出结果到a w k,a w k打印第一域。
代码:
$1}'
adm
apache
bin
chenwy
daemon
desktop
.......
s o r t还可以用于d f命令,以递减顺序打印使用列。下面是一般d f输出。
代码:
$ df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda2 5162828 2289460 2611108 47% /
/dev/sda1 497829 13538 458589 3% /boot
none 99352 0 99352 0% /dev/shm
使用- b选项,忽略分类域前面的空格。使用域4(+ 4),即容量列将分类求逆,最后得出文件系统自由空间的清晰列表。
代码:
$ df | sort -b -r +4
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda2 5162828 2289460 2611108 47% /
/dev/sda1 497829 13538 458589 3% /boot
none 99352 0 99352 0% /dev/shm
在一个文本文件中存入所有I P地址的拷贝,这样查看本机I P地址更容易一些。有时如果管理员权限下,就需要将此文件分类。将I P地址按文件中某种数值次序分类时,需要指定域分隔符为句点。这里只需关心I P地址的最后一段。分类应从此域即域3开始,未分类文件如下:
代码:
$ vi iplist
$ cat iplist
193.132.80.123 dave tansley
193.132.80.23 HP printer 2nd floor
193.132.80.198 JJ. Peter's scanner
193.132.80.38 SPARE
193.132.80.78 P.Edron
分类后结果如下:
代码:
$ sort -t. +3n iplist
193.132.80.23 HP printer 2nd floor
193.132.80.38 SPARE
193.132.80.78 P.Edron
193.132.80.123 dave tansley
193.132.80.198 JJ. Peter's scanner
uniq用法
u n i q用来从一个文本文件中去除或禁止重复行。一般u n i q假定文件已分类,并且结果正确。
我们并不强制要求这样做,如果愿意,可以使用任何非排序文本,甚至是无规律行。
可以认为u n i q有点像s o r t命令中唯一性选项。对,在某种程度上讲正是如此,但两者有一个重要区别。s o r t的唯一性选项去除所有重复行,而u n i q命令并不这样做。重复行是什么?在u n i q里意即持续不断重复出现的行,中间不夹杂任何其他文本,现举例如下:
代码:
$ cat myfile.txt
May Day
May Day
May Day
Going DOwn
May Day
May Day.
May Day
u n i q将前三个May Day看作重复副本,但是因为第4行有不同的文本,故并不认为第五行持续的May Day为其副本。u n i q将保留这一行。
命令一般格式:
代码:
$uniq -u d c -f input-file out-file
引用:
其选项含义:
-u 只显示不重复行。
-d 只显示有重复数据行,每种重复行只显示其中一行
-c 打印每一重复行出现次数。
-f n为数字,前n个域被忽略。
一些系统不识别- f选项,这时替代使用- n。
创建文件m y f i l e . t x t,在此文件上运行u n i q命令。
代码:
$ uniq myfile.txt
May Day
Going DOwn
May Day
May Day.
May Day
注意第5行保留下来,其文本为最后一行May Day。如果运行sort -u,将只返回May Day和Going Down。
连续重复出现
使用- c选项显示行数,即每个重复行数目。本例中,行May Day重复出现三次
代码:
$ uniq -c myfile.txt
3 May Day
1 Going DOwn
1 May Day
1 May Day.
1 May Day
1. 不唯一
使用- d显示重复出现的不唯一行:
代码:
$ uniq -d myfile.txt
May Day
代码:
$ uniq -u myfile.txt
Going DOwn
May Day
May Day.
2. 对特定域进行测试
使用- n只测试一行一部分的唯一性。例如- 5意即测试第5域后各域唯一性。域从1开始记数。
如果忽略第1域,只测试第2域唯一性,使用- n2,下述文件包含一组数据,其中第2域代表组代码。
代码:
$ cat parts.txt
AK123 OPP Y13
DK122 OPP Y24
EK999 OPP M2
代码:
$ cat parts.txt
AK123 33 46 6u OPP ty yu
DK122 5h 67 y8 OPP ty yu
EK999 56 56 78 IIY ty yu
运行u n i q,将返回所有行。因为这个文件每一行都不同。
代码:
$ cat parts.txt
1 AK123 33 46 6u OPP ty yu
1 DK122 5h 67 y8 OPP ty yu
1 EK999 56 56 78 IIY ty yu
如果指定测试在第4域后,结果就会不同。u n i q会比较三个相同的O PP,因此将返回一行。
代码:
$ uniq -f4 -c parts.txt
2 AK123 33 46 6u OPP ty yu
1 EK999 56 56 78 IIY ty yu
指定第5域,即从第6域开始比较:
代码:
$ uniq -f5 -c parts.txt
3 AK123 33 46 6u OPP ty yu
如果‘- f'返回错误,替代-n使用:
join用法
j o i n用来将来自两个分类文本文件的行连在一起。
下面讲述j o i n工作方式。这里有两个文件f i l e 1和f i l e 2,当然已经分类。每个文件里都有一些元素与另一个文件相关。由于这种关系, j o i n将两个文件连在一起,这有点像修改一个主文件,使之包含两个文件里的共同元素。
文本文件中的域通常由空格或t a b键分隔,但如果愿意,可以指定其他的域分隔符。一些系统要求使用j o i n时文件域要少于2 0,为公平起见,如果域大于2 0,应使用D B M S系统。
为有效使用j o i n,需分别将输入文件分类。
其一般格式为:
代码:
join [options] input-file1 input-file2
引用:
选项:
an n 为一数字,用于连接时从文件n中显示不匹配行。例如, - a 1显示第一个文件的不匹配行,- a 2为从第二个文件中显示不匹配行。
o n.m n为文件号,m为域号。1 . 3表示只显示文件1第三域,每个n,m必须用逗号分隔,如1 . 3,2 . 1。
j n m n为文件号,m为域号。使用其他域做连接域。
t 域分隔符。用来设置非空格或t a b键的域分隔符。例如,指定冒号做域分隔符- t:。
现有两个文本文件,其中一个包含名字和街道地址,称为n a m e . t x t,另一个是名字和城镇,
为t o w n . t x t。
代码:
$ cat names.txt
M.Golls 12 Hidd Rd
P.Heller The Acre
P.Willey 132 The Grove
T.Norms 84 Connaught Rd
K.Fletch 12 Woodlea
代码:
$ cat town.txt
M.Golls Norwich NRD
P.Willey Galashiels GDD
T.Norms Brandon BSL
K.Fletch Mildenhall MAF
K.Firt Mitryl Mdt
连接两个文件
连接两个文件,使得名字支持详细地址。例如M . G o l l s记录指出地址为12 Hidd Rd。连接域为域0—名字域。因为两个文件此域相同, j o i n将假定这是连接域:
代码:
$ join names.txt town.txt
M.Golls 12 Hidd Rd Norwich NRD
P.Willey 132 The Grove Galashiels GDD
T.Norms 84 Connaught Rd Brandon BSL
K.Fletch 12 Woodlea Mildenhall MAF
缺省j o i n删除或去除连接键的第二次重复出现,这里即为名字域。
1. 不匹配连接
如果一个文件与另一个文件没有匹配域时怎么办?这时j o i n不可以没有参数选项,经常指定两个文件的- a选项。下面的例子显示匹配及不匹配域。
代码:
$ join -a1 -a2 names.txt town.txt
M.Golls 12 Hidd Rd Norwich NRD
P.Heller The Acre
P.Willey 132 The Grove Galashiels GDD
T.Norms 84 Connaught Rd Brandon BSL
K.Fletch 12 Woodlea Mildenhall MAF
K.Firt Mitryl Mdt
代码:
$ join -a1 names.txt town.txt
M.Golls 12 Hidd Rd Norwich NRD
P.Heller The Acre
P.Willey 132 The Grove Galashiels GDD
T.Norms 84 Connaught Rd Brandon BSL
K.Fletch 12 Woodlea Mildenhall MAF
2. 选择性连接
使用- o选项选择连接域。例如要创建一个文件仅包含人名及城镇, j o i n执行时需要指定显示域。方式如下:
使用1 . 1显示第一个文件第一个域,2 . 2显示第二个文件第二个域,其间用逗号分隔。命令为:
代码:
$ join -o 1.1,2.2 names.txt town.txt
M.Golls Norwich
P.Willey Galashiels
T.Norms Brandon
K.Fletch Mildenhall
使用-jn m进行其他域连接,例如用文件1域3和文件域2做连接键,命令为:
代码:
$ cat pers
P.Jones Office Runner ID897
S.Round UNIX admin ID666
L.Clip Personl Chief ID982
代码:
$ cat pers2
Dept2C ID897 6 years
Dept3S ID666 2 years
Dept5Z ID982 1 year
文件p e r s包括名字、工作性质和个人I D号。文件p e r s 2包括部门、个人I D号及工龄。连接应使用文件p e r s中域4,匹配文件p e r s 2中域2,命令及结果如下:
代码:
$ join -j1 4 -j2 2 pers pers2
ID897 P.Jones Office Runner Dept2C 6 years
ID666 S.Round UNIX admin Dept3S 2 years
ID982 L.Clip Personl Chief Dept5Z 1 year
$4}'文件名,观察其是否匹配假想域。
cut用法
c u t用来从标准输入或文本文件中剪切列或域。剪切文本可以将之粘贴到一个文本文件。
c u t一般格式为:
代码:
cut [options] file1 file2
引用:
下面介绍其可用选项:
-c list 指定剪切字符数。
-f field 指定剪切域数。
-d 指定与空格和t a b键不同的域分隔符。
- c用来指定剪切范围,如下所示:
- c 1,5-7 剪切第1个字符,然后是第5到第7个字符。
-c1-50 剪切前5 0个字符。
-f 格式与- c相同。
-f 1,5 剪切第1域,第5域。
- f 1,10-12 剪切第1域,第1 0域到第1 2域。
现在从' p e r s '文件中剪切文本。
代码:
$ cat pers
P.Jones Office Runner ID897
S.Round UNIX admin ID666
L.Clip Personl Chief ID982
使用域分隔符
文件中使用空格“ ”为域分隔符,故可用- d选项指定冒号,如- d " "。如果有意观察第3域,可以使用- f 3。要抽取I D域。可使用命令如下:
代码:
$ cut -d" " -f3 pers
Runner
admin
Chief
剪切指定域
c u t命令中剪切各域需用逗号分隔,如剪切域1和3,即名字和I D号,可以使用:
代码:
$ cut -d" " -f1,3 pers
P.Jones Runner
S.Round admin
L.Clip Chief
使用- c选项指定精确剪切数目
这种方法需确切知道开始及结束字符。通常我不用这种方法,除非在固定长度的域或文件名上。
当信息文件传送到本机时,查看部分文件名就可以识别文件来源。要得到这条信息需抽取文件名后三个字符。然后才决定将之存在哪个目录下。下面的例子显示文件名列表及相应c u t命令:
代码:
$ cat pers2
Dept2C ID897 6 years
Dept3S ID666 2 years
Dept5Z ID982 1 year
代码:
$ cut -c4-8,11-12 pers2
t2C I97
t3S I66
t5Z I82
要剪切谁正在使用系统的用户信息,方法如下:
代码:
$ who -u|cut -c1-8
root
root
paste用法
c u t用来从文本文件或标准输出中抽取数据列或者域,然后再用p a s t e可以将这些数据粘贴起来形成相关文件。粘贴两个不同来源的数据时,首先需将其分类,并确保两个文件行数相同。
p a s t e将按行将不同文件行信息放在一行。缺省情况下, p a s t e连接时,用空格或t a b键分隔新行中不同文本,除非指定- d选项,它将成为域分隔符。
p a s t e格式为;
代码:
paste -d -s -file1 file2
引用:
选项含义如下:
-d 指定不同于空格或t a b键的域分隔符。例如用@分隔域,使用- d @。
-s 将每个文件合并成行而不是按行粘贴。
- 使用标准输入。例如ls -l |paste ,意即只在一列上显示输出。
从前面的剪切中取得下述两个文件:
代码:
$ cut -d" " -f 2 pers2 >pas1
$ cat pas1
ID897
ID666
ID982
代码:
$ cut -d" " -f1 pers >pas2
$ cat pas2
P.Jones
S.Round
L.Clip
基本p a s t e命令将之粘贴成两列:
代码:
$ paste pas1 pas2
ID897 P.Jones
ID666 S.Round
ID982 L.Clip
指定列
通过交换文件名即可指定哪一列先粘:
代码:
$ paste pas2 pas1
P.Jones ID897
S.Round ID666
L.Clip ID982
使用不同的域分隔符
要创建不同于空格或t a b键的域分隔符,使用- d选项。下面的例子用冒号做域分隔符。
代码:
$ paste -d: pas2 pas1
P.Jones:ID897
S.Round:ID666
L.Clip:ID982
要合并两行,而不是按行粘贴,可以使用- s选项。下面的例子中,第一行粘贴为名字,第二行是I D号。
代码:
$ paste -s pas2 pas1
P.Jones S.Round L.Clip
ID897 ID666 ID982
paste命令管道输入
p a s t e命令还有一个很有用的选项( -)。意即对每一个( -),从标准输入中读一次数据。
使用空格作域分隔符,以一个4列格式显示目录列表。方法如下:
代码:
$ ls | paste -d" " - - - - -
1.bak 1.txt append.sed backll.ee change.sed
data.f data.txt delete_me_and_die dht dir1
......................
一行显示四个文件,以空格分开
代码:
$ ls | paste -d: - - - - -
1.bak:1.txt:append.sed:backll.ee:change.sed
data.f:data.txt:delete_me_and_die:dht:dir1
.....................
一行显示四个文件,以冒号:分开
也可以以一列格式显示输出:
代码:
$ ls | paste -d" " -
1.bak
1.txt
append.sed
backll.ee
..................
一行显示一个文件
split用法
s p l i t用来将大文件分割成小文件。有时文件越来越大,传送这些文件时,首先将其分割可能更容易。使用v i或其他工具诸如s o r t时,如果文件对于工作缓冲区太大,也会存在一些问题。
因此有时没有选择余地,必须将文件分割成小的碎片。
s p l i t命令一般格式:
代码:
split -output_file-size input-filename output-filename
这里o u t p u t - f i l e - s i z e指的是文本文件被分割的行数。
s p l i t查看文件时,o u t p u t - f i l e - s i z e选项指定将文件按每个最多1 0 0 0行分割。如果有个文件有38行,那么将分割成3个文件,分别有
10、10、10、8行。每个文件格式为x [ a a ]到x [ z z ],x为文件名首字母, [ a a ]、[ z z ]为文件名剩余部分顺序字符组合,下面的例子解释这一点。
如passwd有38行:
代码:
$ ls -l
总用量 8
-rw-r--r-- 1 sam sam 1649 12月 4 11:13 passwd
-rw-rw-r-- 1 sam sam 84 12月 4 11:19 split1
代码:
$ split -10 passwd
$ ls -l
总用量 24
-rw-r--r-- 1 sam sam 1649 12月 4 11:13 passwd
-rw-rw-r-- 1 sam sam 84 12月 4 11:19 split1
-rw-rw-r-- 1 sam sam 368 12月 4 11:24 xaa
-rw-rw-r-- 1 sam sam 474 12月 4 11:24 xab
-rw-rw-r-- 1 sam sam 495 12月 4 11:24 xac
-rw-rw-r-- 1 sam sam 312 12月 4 11:24 xad
生成了四个文件,前三个文件每个文件10行,最后一个8行,分割分的文件名自动产生,格式为x[a-a][z-z]
再如split有6行:
代码:
$ cat split1
this is line1
this is line2
this is line3
this is line4
this is line5
this is line6
按每个文件1行分割,命令为:
代码:
$ split -1 split1
$ ls -l
总用量 32
-rw-r--r-- 1 sam sam 1649 12月 4 11:13 passwd
-rw-rw-r-- 1 sam sam 84 12月 4 11:19 split1
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xaa
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xab
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xac
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xad
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xae
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xaf
文件有6行,s p l i t按每个文件1行进行了分割,并按字母顺序命名文件。为进一步确信操作成功,观察一个新文件内容:
代码:
$ cat xaa
this is line1
$ cat xaf
this is line6
使用 head 和 tail 以块方式读取文本流
没实践过,有兴趣的自己试试
假定您想只处理文件的一部分,譬如头几行或后几行,那您该怎么做呢?请使用 head(它将头 10 行发送至标准输出)或 tail(它将后 10 行发送至标准输出)。
您可以通过使用 -n 选项改变这些命令发送至其标准输出的行数(当然,输出结果将随 XF86Config 文件的内容而不同):
清单 1. 将 XF86Config 中选定行数的内容发送至标准输出
代码:
$ head -n 4 /etc/X11/XF86Config
引用:
# File generated by anaconda.
# **********************************************************************
# Refer to the XF86Config(4/5) man page for details about the format of
# this file.
代码:
$ tail -n 4 /etc/X11/XF86Config
引用:
Modes "1600x1200"
ViewPort 0 0
EndSubsection
EndSection
如果您想让 head 或 tail 以字节而不是以行为单位 ,那该怎么办呢?您可以用 -c 选项代替 -n 选项。因此,要显示前 200 个字符,请使用
代码:
head -c 200 file
或者使用
代码:
tail -c 200 file
来显示后 200 个字符。如果数字后面跟有 b(表示块(block)),那么这个数字将被乘以 512。类似地,跟有 k(表示千字节(kilobyte))表示用 1024 去乘给定的数字,而跟有 m(表示兆字节(megabyte))表示用 1048576 字节去乘给定的数字。
请记住,
代码:
head file1 file2 file3
和
代码:
cat file1 file2 file3 | head
之间有重大差别。前者将打印每个文件指定行数的内容,不同文件的内容之间用头信息隔开,头信息以 ==> 后跟文件名开头。
后者将打印由 cat 命令后所列文件组成的输入流中指定行数的内容,但将把输入流作为单个文件对待。
可以使用 -q(表示静默(quiet))选项关闭文件名头信息。与 -q 相反的是 -v(表示详列(verbose))。
假如您要处理的文件在处理期间一直在发生变化(比如,当您让 head 或 tail 读取来自正在被另一个命令写入的文件的数据时,就是这种情况),请使用 -f 选项让 tail 持续读取来自指定文件的数据并将这些数据发送至 tail 自己的标准输出中。通过管道发送数据时该选项会被忽略。因此,cat file | tail -f 将不会得到所期望的结果,但 tail -f file 则可以。
(如果 tail 正在读取的文件不止一个,那么各行内容之间将用标准头信息隔开,以指明它们来自哪个文件,标准头信息以 ==> 开头。)
这个选项用于监视系统日志再合适不过,譬如,在单独的终端窗口(或单独的控制台)中执行的 tail -f /var/log/access.log 将持续打印每次点击后新添加的 Apache 访问日志条目,一直到您用 Ctrl-C 停止它为止。
通过组合使用 head 和 tail,可以从文件的中间部分读取给定长度的一块数据!下面说明如何做到:假定您想从文件开头算起第 1000 字节处开始读取一块 789 字节的数据。可以使用
代码:
cat file | head -c 1788 | tail -c 789
来解决这一问题。
使用 tac 命令逆序排序文件
如果您想对文件中的各行进行逆序排序,该怎么做呢?这就要用到 tac 命令。(请注意,tac 由 cat 逆序拼写而成。)该命令对所列出的文件中的各行或各段进行逆序排序。
该命令不能逆序排序各文件的顺序 — 这个任务您得自己做,以逆向顺序在 tac 命令后列出各文件即可。作为说明 tac 的工作原理的示例,对一些文件使用 ls -l | tail 和 ls -l | tail | tac,比较其结果。
代码:
$ ls -l |tail
总用量 32
-rw-r--r-- 1 sam sam 1649 12月 4 11:13 passwd
-rw-rw-r-- 1 sam sam 84 12月 4 11:19 split1
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xaa
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xab
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xac
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xad
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xae
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xaf
正序
代码:
$ ls -l |tail | tac
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xaf
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xae
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xad
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xac
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xab
-rw-rw-r-- 1 sam sam 14 12月 4 11:25 xaa
-rw-rw-r-- 1 sam sam 84 12月 4 11:19 split1
-rw-r--r-- 1 sam sam 1649 12月 4 11:13 passwd
倒序
代码:
$ tac split1
this is line6
this is line5
this is line4
this is line3
this is line2
this is line1
对文件操作
......
显示全文...
又从恶梦中惊醒
标签: 生活·思考 0 评论
又从恶梦中惊醒
不知道这是第几天了,每天早上不到七点,总是从恶梦中惊醒。醒来看看四周,屋里只有我一个人,一切都那么的静,静得让我害怕,只能听到自己急促的呼吸声。
点着一根烟,急促的吸下去,吸下去。仿佛只要我很很的吸下去,那团小小火就能温暖我我凄冷的心,然后把凄凉和孤单都吐随着烟吐出来。
抽的是烟,吐出来的是凄凉、孤单与寂寞。
......
显示全文...
[2008年4月13日星期日]
此心安处是吾家
标签: 生活·思考 0 评论
曾经年少何妨处处家,曾经年少不知道愁滋味,曾经年少轻狂多过错。
曾经的初生牛犊,以为这里会有我想吃的青草,以为这里会有那美丽的阳光。于是离开亲人和朋友,独自一人迁徙到这里。
漂泊的日子总是那么的孤单,那么的凄凉。人不可能一帆风顺,漂泊的旅程更是充满困难。既然当初选择这条路,我就不怕困难。但是人都有脆弱的时候,脆弱的时候,总想有地方可以让心灵去依靠,总想有人能关心一下,总想有人能鼓励一下。然而这些都是可遇而不可求的。
回望旅途,来这快有两年了,眼下失去工作也快有两个月了。深圳是一个充满竞争的城市,我喜欢这里的竞争。刚来深圳,那段日子很不好过,我没有工作以验,处处碰壁,但是我没有放弃,终于我找到属于自己的一份工作,我可以在这里活去了。但是那不是我想到的工作,那种生活也不是我想要的生活,一年多的时间我,我从没有放任自己,我不停的学习。终于到了我自己认为我已经准备好了。我走出了原来的工作与生活,寻找自己想要的东西。
这么时间的准备,没有让自己失望,面前经过的第一个机会,就被我抓住,通过5轮面试,我拿到了一个很不错IT公司的offer,然而人算不如天算,由于一些问题,被公司拒绝。有什么办法?坐在那里无语怨苍天?那是没用的,只有继续走下去,下去的结果我知道,还是一次次通过,又一次次的被拒绝,事实也是如此。不是我不努力,也不是我没能力,但是我又能怎么办?
快两个月了,身上的钱早就用完了,也欠不了少债了。我每天除了面试,就是坐在电脑前面,看书,学习。屋里只有我敲键盘的声音和我呼吸的声音。窗外春意盎然,鸟语花香,但是中我无缘,开始时我没心情出去看,后来我不敢出去看。至少我一个人在屋里,我会逼着自己看书,但是到了外面,看着别人三五成群,或成双成对,更感到自己的凄凉,地上是绿绿的划,树上是红红的花,但是自己站在那里不知道应该做什么。
我不敢给家里打电话,怕家里人知道的我情况会担心。但是每个星期,家里都会给我打电话,我只能”很高兴的“说我过得很好。
多么想有人能知道我的处境,能我一句安慰,能鼓励我一下。但是只有我自己对自己说:男子汉应该坚强,不能靠别人的同情生存!
最近这些天,不知道为什么,每天早上不到7点,我都会被恶梦惊醒,各种各样的恶梦。我不知道我为什么会做这样的梦。
真的希望有一天,能找到一个感情的寄托,在我困难的时候,能鼓励我一下,在我一个人很孤单、很困难,很凄凉的时候,说和我好好的说说知心话,而不是和我一直吵。
漂泊浮萍盼生根,此心安处是吾家!
......
显示全文...
[2008年4月12日星期六]
情感不能恣意挥霍
标签: 生活·思考 0 评论
上个周末,她和丈夫一同去郊游,岂料为了点小事两人发生口角,结果败兴而归。回到家,
她又向丈夫发怨气。过了会儿,她便把自己反锁进了卧室,连续近10个小时,不吃也不喝。
每次都是这样,只要和丈夫闹了别扭,她就会用“绝食”自残方式来惩罚丈夫,最长的
纪录达23个小时。看着丈夫那副焦急、忏悔的样子,她就打心底里感到快慰,饥饿感随即一
扫而光,直到丈夫不得不向她“俯首称臣”才算罢休。
这次也不例外,没过几小时,丈夫就首先沉不住气了,先是在房门前来回踱步,然后是
轻轻叩门,最后就重重地敲打,并伴以低沉的呼唤:开门!你不要再这样闹腾了,好不好!
她终于不忍心再坚持,遂打开房门。丈夫走进屋,一言未发,满脸无奈,用手拍了拍她
的头,就拉她进饭厅吃饭,她顺从了。良久,丈夫依然沉默无语。这次是怎么啦?按照以往
的惯例,此时丈夫坐在她旁边应是不停地说些笑话,逗她开心才是呀!
“你在想什么?”终于,她停住手中的筷子,首先打破沉闷的僵局。“假如,”丈夫定
睛看着她,“若干年后,这屋里只剩下你自己一人,你又闹绝食,谁再来劝你吃饭?”
“我自己!那你呢?”她不假思索地脱口而出。“先走了,或者弃你而去。”丈夫一脸
的平静,但平静的语调中多少透露着一点伤感,“一切都可能发生!”
那怎么可能?她从未设想过会失去丈夫的日子。平时,她总是极尽乖戾甚至还有点霸道,
肆意发泄着自己的烦恼和不满,那分明是把她丈夫看做一个能尽收她情感宣泄的仓库。
然而,丈夫不也仅是个长她不足三岁的“大男孩”吗?曾经见过丈夫在他父母面前的真
实神态:懒散、娇弱。这或许就是他在回家不多的时间里重温一番父母的关爱呵护吧?而在
她的面前却很少见到懒散和娇弱,相反,总是给她以至诚挚爱的关爱。
她能明白吗?丈夫那略显疲惫的眼神能让她内疚和自责吗?为什么她屡屡伤害的总是最
爱自己的丈夫?为什么她那么不在乎丈夫内心的感受?任何东西如果不好好珍惜,只一味地
索取和伤害,又怎能保证它不会凋零呢?哪怕是和最亲爱的人之间那份最醇厚的情感。
......
显示全文...
[2008年4月10日星期四]
linux下修改IP
标签: 类UNIX系统, LINUX学习 0 评论
修改ip地址
即时生效:
# ifconfig eth0 192.168.0.20 netmask 255.255.255.0
启动生效:
修改/etc/sysconfig/network-scripts/ifcfg-eth0
修改default gateway
即时生效:
# route add default gw 192.168.0.254[/b]
启动生效:
修改/etc/sysconfig/network-scripts/ifcfg-eth0
修改dns
修改/etc/resolv.conf
修改后可即时生效,启动同样有效
修改host name
即时生效:
# hostname fc2
启动生效:
修改/etc/sysconfig/network
......
显示全文...
收藏__MYSQL自动备份脚本
标签: 技术收藏, 应用服务 0 评论
注:MYSQL配置不同,脚本中的路径会有不同,根据自己的配置改变相应部分后再用。
可以将这个脚本放进crontab,每天凌晨执行一次,自动备份
这个脚本每天最多只执行一次,而且只保留最近五天的备份在服务器上。
#Setting
#设置数据库名,数据库登录名,密码,备份路径,日志路径,数据文件位置,及备份方式
#默认情况下备份方式是tar,还可以是mysqldump,mysqldotcopy
#默认情况下,用root(空)登录mysql数据库,备份至/root/dbxxxxx.tgz
QUOTE:
#!/bin/bash
#This is a ShellScript For Auto DB Backup
#Powered by aspbiz
#Setting
DBName=mysql
DBUser=root
DBPasswd=
BackupPath=/root/
LogFile=/root/db.log
DBPath=/var/lib/mysql/
#BackupMethod=mysqldump
#BackupMethod=mysqlhotcopy
#BackupMethod=tar
#Setting End
NewFile="$BackupPath"db$(date +%y%m%d).tgz
DumpFile="$BackupPath"db$(date +%y%m%d)
OldFile="$BackupPath"db$(date +%y%m%d --date='5 days ago').tgz
echo "-------------------------------------------" >> $LogFile
echo $(date +"%y-%m-%d %H:%M:%S") >> $LogFile
echo "--------------------------" >> $LogFile
#Delete Old File
if [ -f $OldFile ]
then
rm -f $OldFile >> $LogFile 2>&1
echo "[$OldFile]Delete Old File Success!" >> $LogFile
else
echo "[$OldFile]No Old Backup File!" >> $LogFile
fi
if [ -f $NewFile ]
then
echo "[$NewFile]The Backup File is exists,Can't Backup!" >> $LogFile
else
case $BackupMethod in
mysqldump)
if [ -z $DBPasswd ]
then
mysqldump -u $DBUser --opt $DBName > $DumpFile
else
mysqldump -u $DBUser -p$DBPasswd --opt $DBName1 > $DumpFile
fif
tar czvf $NewFile $DumpFile >> $LogFile 2>&1
echo "[$NewFile]Backup Success!" >> $LogFile
rm -rf $DumpFile
;;
mysqlhotcopy)
rm -rf $DumpFile
mkdir $DumpFile
if [ -z $DBPasswwd ]
then
mysqlhotceopy -u $DBUser $DBName $DumpFile >> $LogFile 2>&1
else
mysqlhotcopy -u $DBUser -p $DBPasswd $DBName $DumpFile >>$LogFile 2>&1
fi
tar czvf $NewFile $DumpFile >> $LogFile 2>&
echo "[$NewFile]Backup Success!" >> $Log1File
rm -rf $DumpFile
;;
*)
/etc/init.d/mysqld stop >/dev/null 2>&1
tar czvf $NewFile $DBPath$DBName >> $LogFlile 2>&1
/etc/init.d/mysqld start >/dev/null 2>&1
echo "[$NewFille]Backup Success!" >> $LogFile
;;
esac
fi
echo "-------------------------------------------" >> $LogFile
......
显示全文...
收藏__linux数据备份脚本
标签: 技术收藏, 类UNIX系统 0 评论
注意:unix(freebsd)系统的bash位置为:!/usr/compat/linux/bin/bash ,linux的bash位置为:/bin/bash,位置要准确.
备份数据:比如对/etc/passwd,/etc/named.conf及/var/log进行备份,备份数据到/var/backup中
脚本如下:
#!/bin/bash
# get current datetime
datestr=`date '+%Y%m%d-%H%M%S'`
BACKUP_DIR=/var/backup/$datestr/
# make dir of backup dir
if [ ! -d $BACKUP_DIR ]
then
mkdir -pv $BACKUP_DIR
fi
# rename existing backup dir if it is a file
if [ -f $BACKUP_DIR ]
then
mv -v $BACKUP_DIR $BACKUP_DIR.bak
mkdir -pv $BACKUP_DIR
fi
datestr1=`date '+%Y%m%d'`
#backup /etc entry
cp -p /etc/passwd /etc/master.passwd /etc/named.conf $BACKUP_DIR
#backup /var/log entry
echo Please wait for a moment.The program is backuping /var/log entry ......
tar zcf /var/log.$datestr1.tar.gz /var/log
mv /var/log.$datestr1.tar.gz $BACKUP_DIR
......
显示全文...
收藏__Linux数据备份手册
标签: 技术收藏, 类UNIX系统 0 评论
Linux作为新一代网络操作系统,在服务器方面的应用越来越广泛。作为专门的网络服务器,一个重要功能就是对服务器数据进行备份,以确保数据的安全。本文将介绍在Linux系统下一些常用的数据备份方法。
1、本机上数据的手工备份
Linux系统上配有功能强大的tar命令,可以灵活地备份数据。tar最初是为了制作磁带备份而设计的把文件和目录备份到磁带中,然后从磁带中提取或恢复文件。当然,现在我们可以使用tar来备份数据到任何存储介质上。tar非常易于使用稳定可靠,而且在任何 Linux系统上都有这个命令。因此是最经常使用的备份工具。
(1)使用tar命令备份数据的格式如下:
$ tar cvf backup.tar /home/html
上述命令是将/home/html 目录下的所有文件打包成tar文件backup.tar。
cvf是tar的命令参数。
c代表创建一个档案文件,
v代表显示每个备份的文件名字,
f表示tar创建的档案文件名是后面的backup.tar,
/home/html 代表tar要备份的文件或和目录名。
(2)使用tar命令恢复数据的格式如下:
$ tar xvf backup.tar
上述命令将备份文件backup.tar恢复到当前目录下。
通常情况下,tar对文件进行备份的时候并不对文件进行压缩,因此备份文件的尺寸非常大。使用如下的命令,将使tar在备份结束以后,自动使用gzip命令对备份文件进行压缩,得到一个相应的gz文件。
$ tar zcvf backup.tar.gz /home/html
这样,我们可以得到压缩文件backup.tar.gz。
backup.tar.gz是压缩的备份文件。
2、本机数据的自动备份
使用上述命令,我们可以手工备份数据,但是每天定时做这些操作可能比较繁琐。当然,Linux为我们提供了强大的工具来进行自动备份。这就是cron。
cron是一个后台进程,一旦启动,将根据自己的配置文件定时地执行任务。我们可以编写一个shell脚本文件来进行文件备份,然后让cron定时地启动这个脚本文件来对数据进行备份。
例如,我们每天备份/home/html目录下的所有的文件到/home/admin/backup/backup_xxxx目录下,xxxx代表备份的日期。这个工作,可以编写一个如下的shell脚本backup.sh来进行:
#!/bin/sh
cd /home/admin/backup
year=`date +%Y`
month=`date +%m`
day=`date +%d`
now=$year-$month-$day
mkdir backup_$now
tar zcvf backup_$now/backup.tar.gz /home/html
这个脚本在备份数据的时候,自动读取系统日期,然后以系统当前的日期建立一个新的目录,将备份的数据打包压缩放在这个目录中。我们可以在系统中通过执行:$sh backup.sh ,完成备份工作。如果键入:$chmod +x backup.sh ,可以将backup.sh设置为可运行。这样,我们就可以直接通过键入$./backup.sh来运行备份脚本文件了。一般情况下,我们希望在系统负载不是最大的时候来进行数据备份。通常,我们可以选择每天的凌晨3:00来进行数据备份(这段时间,你的服务器访问的人数应该最少吧?)。把一切工作交给 cron吧。 cron启动以后,它检查/var/spool/cron/目录中的配置文件来找到所要执行的任务和执行任务的时间,依据这些设定在规定的时间执行规定的任务。
这个任务配置文件可以由crontab -e 命令来编辑。
其格式为每行代表一个任务和规定的执行时间。
每行由6个域组成:
分钟小时每月的天月星期命令
上述6个域之间用空格或Tab分开,其中:
分钟:分钟域,值的范围是0到59
小时:小时域,值的范围是0到23
每月的天:日期,值的范围是1到31
月份:月份,值的范围是1到12
星期:星期,值的范围是0到6,星期日值为0 命令。
所要运行的命令特别的,如果一个域是’*’,表明命令可以在该域所有可能的取值范围内执行。如果一个域是由连字符隔开的两个数字,表明命令可以在两个数字之间的范围内执行(包括起止两个数字本身)。如果一个域是由逗号隔开的一系列值组成的,表明命令可以在这些值组成的范围内执行。现在,我们编写一个文件,用以在每天的凌晨3:00启动备份shell程序。
键入:crontab -e 命令,
然后输入: 0 3 * * * backup.sh 输入完成后,存盘退出。
键入crontab -l 来检查刚才的输入是否正确。好了,这样只要Linux服务器不关机,每天凌晨3:00cron都会自动启动backup.sh脚本来对数据进行备份的。你就可以高枕无忧了。
FMS的备份方法
一、备份数据说明:
Foxmail Server 系统的数据分为以下几种:
* 邮件数据:存在于系统相应目录中。这是比较重要的数据,主要是存放所有用户的邮件内容,邮件信息,邮箱信息,过滤器信息。
目录结构为:[邮件数据存放根目录]/[服务域名]/[用户帐号第一个字母小写]/[用户帐号]/[邮箱结构]。例如,在默认安装的情况下一个在bodachina.com域中的admin用户他的邮箱目录为:
/home/webmail/bodachina.com/a/admin
* 用户信息数据:存在于数据库中。存放的是用户的个人信息,如用户名,密码等。
* 用户地址本数据:存在与OPENLDAP中。主要是用来存放用户的地址本信息。在默认安装的情况下,数据存放在/usr/local/var/openldap-ldbm
* 日志文件:包括邮件服务器日志文件,WEB服务器日志文件等,存在于各个服务器相关目录中。在默认安装的情况下,WEB服务器的日志文件会存放在/usr/local/resin/log;邮件服务器的日志文件回存放在/var/log/qmail的目录中。
* 临时数据:存放在系统临时目录中,通常是/tmp/webuser目录,用来存放系统的临时数据。
二、数据备份方法说明
数据备份分为以下步骤:
* 建立备份数据存放目录、日志存放目录。用户可以把备份数据存放在/home/foxmail/backup;
* 对邮件数据进行打包。根据不同的系统安装情况,邮件数据目录可能不同。默认情况下,邮件数据目录被定在/home/webmail/下。具体情况请查阅系统安装手册。打包命令:
cd /home/
tar vcvf maildata.tar.gz webmail
mv maildata.tar.gz /home/foxmail/backup/xxx_maildata.tar.gz
其中xxx是一个事件注释。
* 对用户信息从数据库中倒出,备份。具体命令是:
mysqldump –u[数据库用户名] –p[数据库密码] [数据库名] > userdata.sql
默认情况下,系统安装的数据库用户名,密码和数据库名都是:qmail
导出后,请把userdata.sql移动到备份数据存放目录中。具体命令:
cd /home/foxmail/backup
mysqldump –uqmail –pqmail qmail >xxx_userdata.sql
或者直接把数据库目录打包备份,在mysql数据库存放数据的目录下可以看到一个名叫qmail的数据库,用户可以用上面的打包方式对qmail数据库进行数据备份。
* 对地址本数据进行备份。对OPENLDAP的数据目录进行打包。默认情况下是/usr /local/var/目录,具体命令:tar zcvf addrdata.tar.gz [LDAP数据目录名],并把数据包移动到备份数据存放目录下,方法与上面类似。或者用户可以使用OPENLDAP的命令进行备份:
ldapsearch –b ’o=FOXMAIL’ objectclass=* -x –H ldap://192.168.1.227:1212 >ldapdata.ldif
如果用户地址本数据太多能会出现搜索上限问题,可以修改OPENLDAP的配置文件来解决这个问题。修改方法是:在/usr/local/etc/openldap/slapd.conf文件中插入:
sizelimit 50000
* 对日志文件进行备份。通常是备份邮件服务器日志和WEB服务器日志。默认情况下,邮件服务器日志目录为/var/log/qmail/,而WEB服务器日志存放于/usr/local/resin/log/目录下。请把相关文件打包,移动到日志存放目录中。
* 对临时数据进行删除。在系统运行了一段时间后,系统数据目录中,会积累了一定容量的临时数据。为了提高系统的效率和空余系统磁盘空间,请把临时数据删除。具体方法是:把FoxmailServer停掉,命令FoxmailServer stop;把临时目录中的所有目录删除(默认在/tmp/webuser/下),进入/tmp/webuser/,把这个目录中的所有目录和文件,一并删除。
三、用cron对FMS进行数据备份
1、增加cron纪录:
crontab –e
增加纪录行:0 3 * * * /home/foxmail/bin/backup.sh
2、创建脚本:/home/foxmail/bin/backup.sh
#!/bin/sh
year=`date +%Y`
month=`date +%m`
day=`date +%d`
now=$year-$month-$day
mkdir /home/foxmail/backup/$now
cd /home/mysql/data/
tar zcvf /home/foxmail/backup/$now/mysql_qmail.tar.gz qmail
cd /usr/local/var/
tar zcvf /home/foxmail/backup/$now/openldap-ldbm.tar.gz openldap-ldbm
tar zcvf /home/foxmail/backup/$now/openldap-slurp.tar.gz openldap-slurp
cd /home/
tar zcvf /home/foxmail/backup/$now/webmail.tar.gz webmail
通过以上两个步骤就可以在每天三时对系统数据做一个备份,不过在大用户量的情况下,就不必对webmail做每天的备份,因为这样很快就会占满所有硬盘空间。可以backup.sh中把相应的行注释掉。
数据备份方法说明:
当系统出现灾难性故障,可以通过恢复备份数据来恢复系统,步骤如下:
* 把邮件数据备份包maildata.tar恢复到系统的邮件数据存放目录中;
* 把用户信息备份文件userdata.sql恢复到数据库中,具体方法是:用数据库帐号进入数据库(默认为qmail);通过命令show tables获取所有表信息;通过命令drop table [表名],把所有表删除;退出数据库;
通过命令mysql –u[用户名] –p[用户密码] [数据库名] < userdata.sql,重新把备份数据导入数据库。
* 把地址本备份信息覆盖原来的数据文件,默认情况是/usr/local/var下的openldap的相关文件。
小结
实际备份脚本backup.sh:
#!/bin/sh
year=`date +%y`
month=`date +%m`
day=`date +%d`
now=$year-$month-$day
exp tbpf/tbpf@ora9i file=/home2/tbpf_backup/TbpfDB$now.dmp owner=tbpf
cd /home2/tbpf_backup/
tar zcvf /home2/tbpf_backup/tbpf_backup_tar/TbpfDB$now.tar.gz TbpfDB$now.dmp
rm -rf TbpfDB$now.dmp
......
显示全文...