★ 多字段排序
sort命令有多字段排序功能
-
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中指定时间段的数据
-
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会匹配余下的所有行直到最后一行。
-
sed -n '/15:32:00/,$p' monitor.log
取15:32:00以后到现在的所有行
-
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中的时间字串要加引号。
★ 两个文件中,拥有部分相同数据的行,把这些行加在一起
-
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同时使用
★ 替换含有指定字符串的所有文件
-
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 后,使用这个快捷键恢复上次删除的内容
★ 查找指定目录下的死链接
-
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 压缩包内的文件
-
zgrep -a -e 'ok|false|ng' 2012032*.tar.gz
zgrep 可以直接检索gz压缩包中的内容,默认是不能检索 tar 包中的内容的,可以加 -a 参数
-a 可以检索 tar 包中的内容
-e 使用pattern
不可以使用 -ae 这种格式,会使 e 参数失去作用
-
zcat filename.gz | grep abc
zcat 可以查看 gz 压缩包中的内容
-
bzcat filename.bz2 | grep abc
bzcat 可以查看 bz2 压缩包中的内容
★ 记录屏幕输出的所有内容
在/etc/profile中添加如下内容:
-
if [ $UID -gt 500 ]
-
then
-
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
-
fi
script 可以把当前用户的所有键盘操作、屏幕输出以及错误信息等等保存到一个文件中。
-a 用append的形式在文件中追加,若不适用此参数,同名的记录文件会被覆盖,而且没有提示;
-f Flush output after each write;
-q be quiet
-t 生成时间文件,有了这个文件,可以使用 scriptreplay 命令回放;
如:scriptreplay username-500-201111262310.date username-500-20111126231.log
要注意“时间文件”和“记录文件”的顺序,不要颠倒了;
可以配合以下命令防止用户自行修改记录文件
-
chattr +a -R /var/log/hist
★ 在远程机器上执行本机写好的shell脚本
-
ssh 10.19.55.66 "bash" < /home/hhh/shell/sync_time.sh
这样可以实现本地写好脚本,无需上传至远程机器,就可以在远程机器执行脚本的目的;
阅读(1535) | 评论(0) | 转发(0) |