可可熊的窝

Tag Archives: Shell

shell脚本解题6

IN:Shell, 编程相关   Tags: , , ,    Comments:2

问题:
执行命令前暂时回home目录,执行后跳回来

解法:
1.

 (cd ~; ls; )

使用子shell的方式去执行命令;

把这行
gs.AddMany( [b_cls,b_bck,t_blank,b_close,b_7,b_8,b_9,b_div,b_4,b_5,b_6,b_mul,b_1,b_2,b_3,b_minus,b_0,b_dot,b_equal,b_plus, ])
进行替换,每一个元素替换为类似(b_cls,0,EXPAND)这样

解法1.

sed 's/[b|t]_[^,]*,/(&0,EXPAND)/g'

如果使用

's/[b|t]_.*?,/(&0,EXPAND)/g'

则不能得出正确的结果,因为sed不支持.*?这样的非贪婪匹配;解法中使用[^,]避免了贪婪匹配。

有如下内容,想要获取 8B E5 55 这些内容:
[cocobear@cocobear ~]$ cat file.txt
00401038 8B E5 mov esp,ebp
0040103A 55 push ebp
0040103B 8B EC mov ebp,esp
0040103D 33 FF xor edi,edi
0040103F 57 push edi
004010A9 FF D0 call eax
004010AB 83 C4 03 add esp,3

解法1:

sed 's/[^ ]* \([0-9A-Z ]\+\).*/\1/' file.txt

解法2:

awk -F'   ' ' {print $1}' file.txt | awk '{print $2,$3,$4,$5}'

再看一正则表达式str=”uid=100(guest) gid=100(others) groups=10(users),11(floppy)”

输出guest:echo $str|sed ‘s/[^(]*(\([^)]*\)).*/\1/’
输出各括号里的:echo $str | awk -F’[()]‘ ‘{print $2″ “$4″ “$6″ “$8}’

BTW:最近在使用delicious时发现添加在Opera工具栏中的“Bookmark on Delicious”挺方便:delicious,看了下这个工具栏按钮的属性,发现其实就是一段JS代码,就修改了一下做了个google当前网站的小工具:

javascript:(function(){s=window.location.href.split("//")[1].split("/")[0];f='http://www.google.com/search?hf=en&newwindow=1&q=+'+encodeURIComponent('site://'+s);a=function(){if(!window.open(f,'deliciousuiv5','location=yes,links=no,scrollbars=no,toolbar=no'))location.href=f+'jump=yes'};if(/Firefox/.test(navigator.userAgent)){setTimeout(a,0)}else{a()}})()
08-19
2008

处理了下网站

IN:Linux   Tags: , ,    Comments:4

改了info域名后网站以前里很多页面里有cocobear.cn,连一些图片也显示不出来,今天就处理了一下:

把网站里一些文件做替换,先备份一下:
grep cocobear.cn ./cocobear.info/ -R -l –binary-files=without-match|xargs -i cp –parents {} bk/

然后全部替换:
grep cocobear.cn ./cocobear.info/ -R -l –binary-files=without-match | xargs sed -i ‘s/cocobear\.cn[^@]/cocobear\.info/g’

剩下就是数据库里的内容了,主要是wp_posts表中的post_content字段,还有guid字段,还有wp_comments中的comment_author_url,wp_postmeta中的meta_value;
操作的命令是:
mysql> update wp_posts set post_content=replace(post_content,”http://www.cocobear.cn”,”http://cocobear.info”);

当然在进行数据库操作时一定要记得先备份一下:
mysqldump -h mysql.1g50.cn -u cocobear -p cocobear > 0808151.sql

使用 mysqldump -h mysql.1g50.cn -u cocobear -p cocobear < 0808151.sql恢复似乎不太好,还是进mysql里使用source ~/0808151.sql进行恢复。

08-15
2008

shell脚本解题5

IN:Shell, 编程相关   Tags: ,    Comments:0

问题:
随机输出目录下5个文件:

解法:
1.

#! /bin/bash
arr=($(ls *.sql.gz))
len=$((${#arr[@]}+1))

for((i=1;i&lt;6;i++))
do
        RANDOM=$(($$+i))
        echo ${arr[$((RANDOM%len))]}
done

这种方法有可能会产生重复的文件。
2.

ls * 'BEGIN {srand()} {A[NR]=$0;} END {for(i=0;i&lt;5;++i) { n=int(rand()*FNR)+1; print A[n]} }'

同样这个也有可能重复。
3.

ls *sql.gz | awk 'BEGIN{srand()}{a[rand()" "NR]=$0}END{for(i in a) {print a[i];if(++j==5) break}}'

将600个同一目录下的文件随机分成3份,每份200个:

解法:
1.

ls | awk 'BEGIN{srand();b[1]="path1";b[2]="path2";b[3]="path3"}{a[rand()" "NR]=$0}END{for(i in a){if(k++%200==0) j++;print "mv "a[i]" "b[j]}}' | sh

对这样的代码进行缩进:

void func1()
{
if()
{
printf();
}
return;
}

void func2()
{
if()
{
printf();
}
return;
}

解法:
1.

awk '/}/{flag--}{if(flag>0) for(i=1;i< =flag;i++) printf "\t";print}/{/{flag++}'

打印字符串hello上下两行,不允许使用grep.

解法:
1.

awk -v n=2 '{a[NR%n]=$0}/hello/{for(i=NR-n+1;i< =NR;i++) if(i>0) print a[i%n];i=0;while(i<n && getline){print;i++}}'

查看23号15点到24号13点之间的系统日志:
sudo cat /var/log/messages | awk ‘$2″ “$3 >= “23 15:00:00″ && $2″ “$3 <= "24 13:00:00"'

07-24
2008

shell脚本解题4

IN:Shell, 编程相关   Tags: ,    Comments:4

问题:
用sed把每行的第二个字符到第六个字符替换成星号
原文
123456
1234567
12345

要求结果

1*****
1*****7
1****

解法:
1.

sed '/^../{h;s/^.\(.\{1,5\}\).*/\1/;s/./*/g;G;s/\(.*\)\n\(.\).\{1,5\}\(.*\)/\2\1\3/}'

2.

sed -r '/.{6}/bb
:a
s/(.\**)[^*]/\1\*/
ta
b
:b
/^.\*{5}/! {
s/(.\**)[^*]/\1\*/
tb
}'

3.

awk '{a=(substr($0,2,5));gsub(/./,"*",a);print substr($0,1,1)a""substr($0,7,length($0))}'

4.

 sed 's/^\(.\)\(.\{1,5\}\)\(.*\)/\1\n\2\n\3/' file  | sed '{n; s/./*/g;n}' | sed '{N; N; s/\n//g}'

5.

sed ':a;/^.[*]\{5\}/!{s/\(.[*]*\)./\1*/;/*$/!ta}'

问题:
比较2008-01-29和2008-02-1之间相差月份

解法:
1.

echo "$date1-$date2" | awk -F'-' '{a=($1-$4)*12+($2-$5);print sqrt(a*a)}'
07-18
2008

shell脚本解题3

IN:Shell, 编程相关   Tags: , ,    Comments:3

问题:
如何将命令的输出信息按行放入到数组里面?

解法:
1.

n=0
while read line;do
        array[$n]="$line"
        ((n++))
done < <(traceroute 192.168.1.1 -n)

echo ${array[0]}

问题:
sed 可以同时匹配多个条件?

比如
file:
AAA BBB CCC DDD
AAA BBB DDD
CCC DDD

sed能实现,同时匹配AAA和CCC就打印,在一条命令中

解法:
1.

sed -n '/AAA/{/CCC/p}'

同时匹配kobe和james:
sed -n ‘/kobe/{/james/p}’
awk ‘/kobe/&&/james/{ print $0 }’

匹配kobe或james:
sed -n ‘/\(kobe\|james\)/p’
awk ‘/kobe/||/james/{ print $0 }’
seq 5|sed ‘$!N;$!D’

07-16
2008

shell脚本解题2

IN:Shell, 编程相关   Tags:    Comments:4

问题:
如下文本

60.208.0.224
60.208.103.192
131.9.124.72
60.208.20.119
60.208.20.9
2.110.213.40
8.56.32.24
60.53.37.128
60.3.98.1

怎么先按ip的第一位sort,然后按第二位sort,然后按第三,第四

结果是这样
2.110.213.40
8.56.32.24
60.3.98.1
60.53.37.128
60.208.0.224
60.208.20.9
60.208.20.119
60.208.103.192
131.9.124.72

解法:
1.

sort -t. -k1,1n -k2,2n -k3,3n -k4,4n

2.

 sed 's/\./ /g' urfile|sort -nt ' ' -k1 -k2 -k3 -k4|sed 's/ /./g'

问题:
httpd.conf文件中含有以下内容,要把Directory块中含有/usr/local/apache/cgi-bin这一块注释掉:

Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all


AllowOverride None
OptionsNone
Orderallow,deny
Allow fromall


Optioin Index
Allow all

解法
1.

sed -r '/^(<directory .*cgi-bin.*)/{s/^/#/;:a;n;/^$/!s/^/#/;ta} ' httpd.conf 

今天写的最长的一行。

2.

sed  '/^</directory></directory><directory .*cgi-bin.*/,/^<\/Directory>/s/^/#/; ' httpd.conf

sed替换大全:

sed ‘s/foo/bar/’ # 替换第一次出现
sed ‘s/foo/bar/4′ # 替换第四次出现
sed ‘s/foo/bar/g’ # 替换所有的出现
sed ’1s/foo/bar/’ # 替换第一行第一次出现

07-15
2008
Page 1 of 212
loading...