Chinaunix首页 | 论坛 | 博客
  • 博客访问: 346360
  • 博文数量: 49
  • 博客积分: 817
  • 博客等级: 军士长
  • 技术积分: 496
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-16 19:05
文章分类

全部博文(49)

文章存档

2014年(6)

2013年(7)

2012年(8)

2011年(28)

分类: LINUX

2011-09-10 16:43:25

★ 多字段排序
    sort命令有多字段排序功能
    
  1. sort -t':' -k 4n -k 3r -n -u /etc/passwd
     -t  指定' : ' 为分隔符( field-separator );
     -k  指定按第几个字段进行排序;-k 4n 表示按第四个字段顺序排列,-k 3r表示在原先排序的基础上按第三个字段逆序排列;(n 表示顺序,r 表示逆序);
     -n  按数字格式排序,很重要。(如 0,1,5,18,31,268排序,不使用 -n 参数会按第一位数字的大小排序成这样0,1,18,268,31,5)
     -u   相同的行只出现一次

★ 截取log中指定时间段的数据
  1. sed -n '/15:32:00/,/15:56:00/p' monitor.log
注:取两个正则表达式之间的行(前提是log中的时间格式与命令中匹配)。注意第二个表达式,sed一遇到满足第二个表达式的行就停止向下搜索,所以以上命令只能搜出15:32分到15:55分以及 15:56分的第一行数据,并不能搜出15:56的全部行。如果并没有 '/15:56:00/' 这个时间点,sed会匹配余下的所有行直到最后一行。

  1. sed -n '/15:32:00/,$p' monitor.log
取15:32:00以后到现在的所有行

  1. awk '{_time=mktime(gensub(/-|:/," ","g",$1" "$2));if(_time>=mktime("2011 05 26 05 00 00")&&_time<=mktime("2011 05 27 20 00 00"))print $0}' *.log
取20110526-5:00:00到20110527-20:00:00之间的log内容,前提是log中记录的时间格式为“2011-05-26 05:00:00”
mktime awk内置函数,mktime( YYYY MM DD HH MM SS[ DST])生成指定时间;
gensub awk内置函数,gensub(正则表达式,替换成,替换范围,字符串);指定替换范围,把字符串中符合正则表达式的部分替换;
注:gensub中的正则表达式不要加 引号,mktime中的时间字串要加引号。

★ 两个文件中,拥有部分相同数据的行,把这些行加在一起
   
  1. join -t':' -i -o1.1 1.3 1.4 2.1 2.4 -1 4 /etc/passwd -2 3 /etc/group
     -t    定义分隔符 ( field-separator )
     -i    忽略大小写
    -o  指定输出字段,FILENO指第几个文件,FIELDNO指第几个字段;-o1.3表示输出第一个文件的第三个字段,可以利用-o来控制输出的字段的顺序
     -1    指定第一个文件用第几个字段连接
     -2    指定第二个文件用第几个字段来连接
    join默认以空格为分隔符,然后比对“第一个字段”的数据,如果两个文件相同,则把两笔数据连接在一起,且第一个字段放在首位;可以利用-o参数来控制输出字段的顺序
   因为passwd的第四个字段是GID,group的第三个字段也是GID,有相同的部分,所以能整合起来。相同的字段部分会移到最前面。join用来处理有相关性的文件很有用,比如passwd,shadow,group,gshadow等。需要注意的是,处理的文件最好先sort排序一下,否则有些比对的项目可能会错过。
  如果想左连接、右连接或者全连接两个文件,可以用参数-a1、-a2、或者-a1 -a2同时使用

★ 替换含有指定字符串的所有文件
  1. sed -i "s/abc@efg\.com/now@yes\.com/g" $(grep -rl "abc@efg.com" /)
此命令对系统中所有包含"abc@efg.com"的文件进行替换,替换成"now@yes.com"
  grep 参数
   -r    递归查询
   -l    显示含有指定字符串的文件的名称
   sed 进行全局替换
如果grep不到内容,则相当于sed命令后边没有输入文件名,命令会停在那里等待输入。


★ 常用组合键
以下快捷键作用于命令行:
!!  执行上一条命令
!$  上次命令的参数
ctrl + a  移动到命令行中的行首
ctrl + e  移动到命令行中的行尾
ctrl + l   清屏
ctrl + r  然后输入关键字,可以指定关键字对 history 进行搜索;
ctrl + u  删除命令行中当前光标前的所有字符(不包括当前字符)
ctrl + k  删除命令行中当前光标后的所有字符(包括当前字符)
ctrl + y  使用 ctrl+u 或者 ctrl+k 后,使用这个快捷键恢复上次删除的内容

★  查找指定目录下的死链接
  1. find ./ -type l | while read i; do [ ! -e $i ] && echo "$i is bad link"; done

★  利用screen命令做同步演示
利用screen命令可以方便的为别人做演示,两人登陆进同一台主机,
演示方输入 screen -S show 建立一个名为show的screen
观看方输入 screen -x show 进入名为show的screen
观看方可以同步的看到演示方屏幕上的内容

★ 检索 tar, bz2, gz 压缩包内的文件
  1. zgrep -a -'ok|false|ng' 2012032*.tar.gz
zgrep 可以直接检索gz压缩包中的内容,默认是不能检索 tar 包中的内容的,可以加 -a 参数
-a  可以检索 tar 包中的内容
-e  使用pattern
不可以使用  -ae 这种格式,会使 e 参数失去作用 

  1. zcat filename.gz | grep abc
zcat 可以查看 gz 压缩包中的内容

  1. bzcat filename.bz2 | grep abc
bzcat 可以查看 bz2 压缩包中的内容

★  记录屏幕输出的所有内容
在/etc/profile中添加如下内容:
  1. if [ $UID -gt 500 ]
  2. then
  3.     exec /usr/bin/script -t 2>/var/log/his/$USER-$UID-$(date +%Y%m%d%H%M).date -a -f -q /var/log/his/$USER-$UID-$(date +%Y%m%d%H%M).log
  4. fi
script 可以把当前用户的所有键盘操作、屏幕输出以及错误信息等等保存到一个文件中。
-a  用append的形式在文件中追加,若不适用此参数,同名的记录文件会被覆盖,而且没有提示;
-f Flush output after each write;
-q be quiet
-t 生成时间文件,有了这个文件,可以使用 scriptreplay 命令回放;
如:scriptreplay username-500-201111262310.date username-500-20111126231.log
   要注意“时间文件”和“记录文件”的顺序,不要颠倒了;
可以配合以下命令防止用户自行修改记录文件
  1. chattr +a -R /var/log/hist

★  在远程机器上执行本机写好的shell脚本
  1. ssh 10.19.55.66 "bash" < /home/hhh/shell/sync_time.sh
这样可以实现本地写好脚本,无需上传至远程机器,就可以在远程机器执行脚本的目的;


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