shell笔记

来源:互联网 发布:空间数据库 吴信才 编辑:程序博客网 时间:2024/05/29 16:37

$
当我们要增加全局性的计划任务时,一种方式是直接修改/etc/crontab。
但是,一般不建议这样做,/etc/cron.d目录就是为了解决这种问题而创建的。
例如,增加一项定时的备份任务,我们可以这样处理:在/etc/cron.d目录下新建文件python-backup,内容如下:
# m h dom mon dow user command
26 16 * * * root tar zcvf /var/backups/home.tar.gz /home/amonest/python
$
cron工作原理:cron由crond守护进程和一组表(crontab文件)组成。
crond守护进程是在系统启动时由init进程启动的,受init进程的监视,如果它不存在了,会被init进程重新启动。这个守护进程每分钟唤醒一次,并通过检查crontab文件判断需要做什么。
cron进程执行时,就会自动扫描该目录下的所有文件,按照文件中的时间设定执行后面的命令。
cron执行时,也就是要读取三个地方的配置文件:一是/etc/crontab,二是/etc/cron.d目录下的所有文件,三是每个用户的配置文件.  
$
粗心了,cat所有文件,然后再写入其中的一个文件,导致死循环。将服务器差点搞残。就是没有进行有效判断。

grep '一个制表符' file
但是在命令行中按tab键总是提示,输入\t也不行,方法是按住ctrl再按v再按i
$
答案是:grep -P '\011' file

bash使用grep求集合差集容易落入的误区 
-F参数是将grep的pattern看做一个固定字符串列表,以回车为分隔符,任何一个字符串都进行匹配
-f参数是从某个指定文件中获取pattern,一次一行
-v参数是获取未匹配的那些行
因此这条命令最终应该输出lista中所有行均不能在listb中匹配到的行。那么这其实不是一个真正求差集的方法,如果lista中某个元素能够在listb的所有行中均匹配到,那么这时候结果就是错误的,因为匹配只需要包含即可。比如集合A存在两个数分别是208974和20,集合B存在的数是120和203,那么这个用法出来的结果就是空的,这是因为20能够在B中匹配到所有的值。由于我需要进行比较的是集合的元素是一个整数,因此就是这种情况。这个问题的解决办法是使用-w参数进行精确匹配。
-w参数 pattern必须与整个字匹配。
不过我后来使用sort和uniq完成了任务,做法如下:
sort listb listb lista|uniq -u

计算按渠道算用户数时
修改地方:求差集时:进行了修改。否则当昨天的日志为空时,会出现求不到差集的情况。
def twofilediffrentsetCmd(self,file1,file2,destfile):
        if os.path.isfile(file1):
                if  os.path.getsize(file2) == 0:
                        #文件内容为空
                        cmd1 = "cp "+file1+" " +destfile
                        logParser.execCmd(cmd1)
                        cmd ="cat " + file1 + "|wc -l"
                else:
                        cmd="awk 'BEGIN{count=0}NR==FNR{a[$1]=1}NR>FNR{ if(a[$1]!=1){count++;print $1 >\""+destfile+"\"}}END{print count}' "+file2+" "+file1
                rs=logParser.getRsByShell(cmd)
                return rs

1 sort -k1,1 -k2,2n
2
3 当对不同的列进行不同的排序方式的时候,需要用k来指定起始列和终止列
4 (相同排序方式则不用写终止列)
5 -k1,1 表示对第一列进行字符串比较  1,1 表示起始列为第一列,终止列也为第一列
6 -k2,2n 表示仅对第二列进行数值比较

有时候,Grep不加引号不准确!比如
42.48.222.23 - - [03/Aug/2012:19:11:43 +0800] GET /query_number.php?v=1.1&hid=867130000289691&r=10104&dev=android&appvers=1.0.0.2602&num=15200214085&qt=dial HTTP/1.0 "200" 88 0.038 "-" "Apache-HttpClient/UNAVAILABLE (java 1.4)" "42.48.222.23"
(1)grep 'query_number\.php' log_merge_20120803parsed.txt   | grep 1\.0\.0\.2896  | grep 'qt=dial'    
采用(1)会出现不准确现象。。
不加单引号和双引号的grep加上反斜线无用。单引号双引号都行。
$
Awk的执行语句必须用单引号,双引号都不行。

linux中删除文件名带横杠的文件的方法 
rm ./-a    或    rm -- -a
man rm里有这个说明
$
多个大文件中grep的方法!!
大文件建议先split!!!!
ls  | grep -v .gz | xargs grep 'defaultbrowser\.gif' > defaultbrowser.txt
$
在grep和sed中,\t和\s都是无效的,要表示制表符和空格,只能直接敲入tab和空格键,这个在shell脚本中还好说,在命令行模式下就
比较麻烦了,因为tab默认是会智能补全命令的,所以要在按tab之前按下ctrl+v,就可以把tab打出来了。

Vim中的搜索符号"/",也是正则表达式。。。。

统计时发现:
Wc -l 一个文件,结果会得到文件名,
先cat 文件,再wc -l 才能只得到次数。。。

当我们查看文件属性时,会看到有类似 lrwxrwxrwx,注意第一个字符是l,这类文件是链接文件。是通过ln -s 源文件名 新文件名。

awk的指定分割符为空格和&号,就用下面的方式写
awk -F '[& ]' '{print $1}'
 -F[":"," "]
这种指定多个分隔符也OK,3个4个都可以
正则表达式中的“或”不适用的|,而是用的[]

Shell语法
一个变量与普通字符串连接用的是双引号,单引号不行,空格不行,其他都不行。
array=(20120619 20120618 20120617 20120616 20120615)
for value in ${array[*]}
do
        echo $value:
        cat log_merge_"$value"parsed.txt |grep 'GET /query_number.php' | awk -F ' ' '{print $1,$7}' | sed 's/&num=/ /' |awk '{print $1,$3}' | awk -F '&' '{print $1}' |sort -n >log_merge_"$valuei"ip_number
done

shell的for数组的遍历:

for value in {20120601..20120619}

do

        echo $value:

done

不要跟php的变量混淆,shell中变量只有在使用时才用$.


数组下标字符串化

在我的 前一篇文章 中,我演示了 awk 实际上以字符串格式来存储数字值。虽然 awk 要执行必要的转换来完成这项工作,但它却可以使用某些看起来很奇怪的代码: 

a="1"

b="2"

c=a+b+3

执行了这段代码后, c 等于 6 。由于 awk 是“字符串化”的,添加字符串 "1" 和 "2" 在功能上并不比添加数字 1 和 2 难。这两种情况下,awk 都可以成功执行运算。awk 的“字符串化”性质非常可爱 -- 您可能想要知道如果使用数组的字符串下标会发生什么情况。例如,使用以下代码:

myarr["1"]="Mr. Whipple"

print myarr["1"]

可以预料,这段代码将打印 "Mr. Whipple"。但如果去掉第二个 "1" 下标中的引号,情况又会怎样呢?

myarr["1"]="Mr. Whipple"

print myarr[1]

猜想这个代码片断的结果比较难。awk 将 myarr["1"] 和 myarr[1] 看作数组的两个独立元素,还是它们是指同一个元素?答案是它们指的是同一个元素,awk 将打印 "Mr. Whipple",如同第一个代码片断一样。虽然看上去可能有点怪,但 awk 在幕后却一直使用数组的字符串下标!

了解了这个奇怪的真相之后,我们中的一些人可能想要执行类似于以下的古怪代码:

myarr["name"]="Mr. Whipple"

print myarr["name"]

这段代码不仅不会产生错误,而且它的功能与前面的示例完全相同,也将打印 "Mr. Whipple"!可以看到,awk 并没有限制我们使用纯整数下标;如果我们愿意,可以使用字符串下标,而且不会产生任何问题。只要我们使用非整数数组下标,如 myarr["name"] ,那么我们就在使用 关联数组 。从技术上讲,如果我们使用字符串下标,awk 的后台操作并没有什么不同(因为即便使用“整数”下标,awk 还是会将它看作是字符串)。但是,应该将它们称作 关联数组 -- 它听起来很酷,而且会给您的上司留下印象。字符串化下标是我们的小秘密。;)

 ¥