可可熊的窝

Category 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

shell脚本解题5

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

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

解法:
1.

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

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

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

ls * 'BEGIN {srand()} {A[NR]=$0;} END {for(i=0;i<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

sed的几个选项

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

sed中有些选项不太好理解,今天就顺一顺:

几个命令:
n
把下一行输入读入模式空间中.当前行被发送到标准输出,下一行将成为当前行.控制将被转移给n后面所跟的命令,而不是回到脚本开始处.

N
把下一行输入行添加到模式空间的内容之后;这两行文本用一个插入的换行符分隔开.

p
打印出寻址到的行.除非使用命令行选项-n,否则该命令会导致输出相同的行.

这里有一段对D的解释
函数参数 D 表示删除 pattern space 内的第一行资料。其指令格式如下:

[address1,address2]D

对上述格式有下面几点说明 :

函数参数 D 最多配合两个位址参数。
函数参数 D 与 d 的比较如下 :
当 pattern space 内只有一资料行时 , D 与 d 作用相同。
当 pattern space 内有多行资料行时
D 表示只删除 pattern space 内第一行资料 ; d 则全删除。
D 表示执行删除後 , pattern space 内不添加下一笔资料 , 而将剩下的资料重新执行 sed script ; d 则读入下一行後执行 sed script。

几个选项:
-e script
执行后面的脚本

-n
禁止自动打印模式空间的内容

例子:

[cocobear@cocobear test]$ cat 1
1
2
3
4
5
6
7
8
9

[cocobear@cocobear test]$ sed -e ‘n’ -e ‘d’ 1
1
3
5
7
9
sed读入第一行内容,执行命令’n',把第二行读入模式空间,向标准输出第一行内容,第二行成为当前行,然后执行后面的命令’d',’d'命令删除模式空间内容(也就是第二行内容),该行处理完成,接下来处理第三行,依此进行.

[cocobear@cocobear test]$ sed -e ‘n’ -n -e ‘p’ 1
2
4
6
8
sed读入第一行内容,执行命令’n',把第二行读入模式空间,向标准输出第一行内容,但由于使用了-n选项,所以这里就没有输出;第二行成为当前行,然后执行后面的命令’p',’p'命令输出模式空间内容(也就是第二行内容),该行处理完成,接下来处理第三行,依此进行.

[cocobear@cocobear test]$ sed -e ‘N’ -e ‘d’ 1
9
sed读入第一行内容,执行命令’N',把第二行添加到模式空间中,然后执行后面的命令’d',’d'命令删除模式空间内容(也就是第一+第二行内容),该行处理完成,接下来处理第三行,依此进行.

[cocobear@cocobear test]$ sed -e ‘N’ -n -e ‘p’ 1
1
2
3
4
5
6
7
8
sed读入第一行内容,执行命令’N',把第二行添加到模式空间中,然后执行后面的命令’p',’p'命令打印模式空间内容(也就是第一+第二行内容),由于-n选项,处理完后sed不会自己再次打印该行处理完成,接下来处理第三行,依此进行.处理完第七行后,使用’N'命令时出错,sed退出.

07-11
2008
Page 1 of 3123
loading...