shell 常用功能性脚本拾遗

8. 字符串查找

 (1)  /data/hadoop/目录下查找包含字符串的saveVersion.sh后缀名为 .xml 的文件:

find /data/hadoop/ -name "*.xml" | xargs grep -H "saveVersion.sh"

(2) 查找/home/user下文件中查找cool

grep -r cool /home/user
在当前所有目录下文件中查找cool,不区分大小写
grep -ir cool .  



1. 统计目录下文件个数:

文件: find ./ -type f|wc -l; 目录就是-d了


2. 统计文件夹大小:

all size: du -s

列出所有的directory: du -S


4. linux kill含某关键字的进程

4.1  无处不在的: ps x|grep gas|grep -v grep |awk '{print $1}'|xargs kill -9


4.2   ps -ef|grep keyword|grep -v grep|cut -c 9-15|xargs kill -9


"ps -ef" 罗列所有进程的命令;"grepkeyword" 的过滤含有关键字"keyword"的进程; "grep -v grep" 是在列出的进程中去除含有关键字"grep"的进程;

"cut -c 9-15" 是截取输入行的第9个字符到第15个字符,对应是进程号PID; "xargs kill -9" 中的xargs 命令是用来把前面命令的输出结果(PID)作为"kill -9"命令的参数,并执行该命令。"kill -9"会强行杀掉指定进程。



5. Apache日志分析: http://www.yaoyingying.com/2009/05/02/apache%E6%97%A5%E5%BF%97%E5%88%86%E6%9E%90/

1,查看apache进程:
ps aux | grep httpd | grep -v grep | wc -l
2,查看80端口的tcp连接:
netstat -tan | grep "ESTABLISHED" | grep ":80" | wc -l
3,通过日志查看当天ip连接数,过滤重复:
cat access_log | grep "20/Oct/2008" | awk '{print $2}' | sort | uniq -c | sort -nr

为什么要用cat呢? 直接grep "20/Oct/2008" access_log |....

参考文章: http://sd.csdn.net/a/20120406/2804243.html


4,当天ip连接数最高的ip都在干些什么:
cat access_log | grep "20/Oct/2008:00" | grep "122.102.7.212" | awk '{print $8}' | sort | uniq -c | sort -nr | head -n 10
5,当天访问页面排前10的url:
cat access_log | grep "20/Oct/2008:00" | awk '{print $8}' | sort | uniq -c | sort -nr | head -n 10
6,用tcpdump嗅探80端口的访问看看谁最高
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr
<pre>
接着从日志里查看该ip在干嘛:
<pre lang="php">
cat access_log | grep 122.102.7.212| awk '{print $1"\t"$8}' | sort | uniq -c | sort -nr | less
7,查看某一时间段的ip连接数:
grep "2006:0[7-8]" www20060723.log | awk '{print $2}' | sort | uniq -c| sort -nr | wc -l


6. shell 与或非

两个特殊操作
     命令1 && 命令2 :只有在命令1执行成功时才执行命令2;
     命令1 || 命令2 :命令1失败才执行命令2;


[root@sp ~]# str="hh"
[root@sp ~]# [ -n "$str" ]  && echo true || echo false
true
[root@sp ~]# [ -n $str ]  && echo true || echo false
true
[root@sp ~]# str=""
[root@sp ~]# [ -n "$str" ]  && echo true || echo false
false
[root@sp ~]# [ -n $str ]  && echo true || echo false
true


7. 字符串替换


7.1 在shell中使用find结合grep进行文件的替换
# find ./ -exec grep str1 ‘{}’ /; -exec sed -i.bak s/str1/str2/g ‘{}’ /;
上面命令可以在当前目录下(包括子目录)查找包含str1的文件,自动替换成str2,并且生成源文件的bak文件

7.2 用sed命令可以批量替换多个文件中的字符串。

sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录`

例如:我要把linux替换为windows,执行命令:

sed -i "s/linux/windows/g" `grep linux -rl /myfolder`


上面的都出错了,下面这条有效的:

find ./old/ -type f -print0 | xargs -0 sed -i 's/old/new/g'


8. 区分空格与tab键

[uq@ubuntu]$ sed -n l tab_space.txt
this is tab\tfinish.$
this is several space finish.$

如果是制表符(TAB),那么会显示为\t符号,如果是空格,就会原样显示, 通过此方法即可以判断制表符和空格了。



3. 一个有趣的问题:scp 传输命令后的文件大小不一致:

问题分析: 

3.1 一个8个节点集群,集群的操作系统完全一样都是RHEL5.3的。  需要从其中一台节点传输数据到不同的节点;

3.2 同一个文件 abc.bin,  ls -s 大小为: 1168424,  md5sum为7e4b6cbf62ca054ba1de3d263e0fe601

3.3 相同的scp命令,传输到某些节点时, ls -s  abc.bin大小为1168428, md5sum为7e4b6cbf62ca054ba1de3d263e0fe601

3.4而另外的一些节点大小与源文件一致,md5也一致;


问题可能出在什么地方呢? 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值