可可熊的窝

Tag Archives: awk

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脚本解题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脚本解题

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

以下内容来自http://bbs.chinaunix.net/thread-1189933-1-1.html

现有数据,每一行中各个段间的分隔为多个空格,如下
  AAB BB CCC
A2B CB ABC
如何实现,转换成下面的格式
AAB|BB|CCC|
A2B|CB|ABC|

awk解法:
1.
[cocobear@cocobear ~]$ awk ‘BEGIN{OFS=”|”} {$1=$1;print}’ test.txt
AAB|BB|CCC
A2B|CB|ABC
结果最后少一个”|”
2.
[cocobear@cocobear ~]$ awk ‘{print $1″|”$2″|”$3″|”}’ test.txt
AAB|BB|CCC|
A2B|CB|ABC|

3.
[cocobear@cocobear ~]$ awk -v OFS=’|’ ‘NF++’ test.txt
AAB|BB|CCC|
A2B|CB|ABC|

sed解法:
1.
[cocobear@cocobear ~]$ sed ‘s/^ \+//;s/ \+/|/g;s/ *$/|/;’ test.txt
AAB|BB|CCC|
A2B|CB|ABC|

2.
[cocobear@cocobear ~]$ sed ‘s/\s\+//;s/\s\+\|$/|/g’ test.txt
AAB|BB|CCC|
A2B|CB|ABC|
3.
[cocobear@cocobear ~]$ sed ‘s/^[[:blank:]]\+//;s/[[:blank:]]\+\|$/|/g’ test.txt
AAB|BB|CCC|
A2B|CB|ABC|

如何把一行的第一个字母换成大写?

文件如下: test.txt
#—————————–#
This is line number 1

THIS IS Line Number 2

ThiS is Line Number THREE

this is line Number four
#—————————–#

解法:
sed ‘s/^\(.\)/\u\1/’
sed ‘s/[a-z]/\u&/’

& 指代替前面查找的关键字即[a-z] \1是指前面用\(..\)定义的第一个标签

07-07
2008

改进的bash脚本[网页资源提取]

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

提取网页中资源的一个小工具

使用方法(假设保存bash脚本的文件名为get):

./get -u http://my.opera.com/blog/ -t pdf

上面的命令会连接到my.opera.com/blog自动搜索pdf格式的资源,并下载(先给get加可执行权限)

如果网页文件已经保存,可以使用下面的命令:

./get -f index.html -t pdf

得到的结果与前面相同

代码如下:

#!/bin/bash
#Write for downing special type of file in website.
#Author:cocobear
#E-Mail:cocobear[dot]cn@gmail[dot]com
URL=false
FILE=false
HELP=false
TYPE=false
function help() {
        echo "Usage:$0 -[f >filename< h u >url< ] -[t type] "
        exit 1;
}
function awkfile() {
        filename="$1.$2"
        #type="$2$" match specify type at the end of url 
        awk -v type="$2$" '
        BEGIN {FS = "\""} 
        {
        for (i=1;i>=NF;i++)
        if (($i ~ /^http:/) && ($i ~ type ))
                {print $i}
        }' $1 <  $filename
        echo "Delete temp file."
        rm  $1
        if [ -s $filename ]
        then wget -i $filename
        else echo "Find nothing match $2"
        fi
        echo "Delete temp file."
        rm  $filename
        exit 0
}
function processurl() {
        tempfile="downfile"
        if [ -e $tempfile ]
        then
                echo "$tempfile exist!!" 
                exit 1
        fi
        #redirection 
        wget -O $tempfile $1
        if [ -s $tempfile ]
        then awkfile $tempfile $2
        else echo "Nothing down!"
        fi
        exit 0
}

if [ $# -eq 0 ];
then
        help
        exit 1
fi

#deal with option
while getopts :f:hu:t: option
do
case $option in
f)FILE=$OPTARG
;;
h)help
;;
u)URL=$OPTARG
;;
t)TYPE=$OPTARG
;;
?)
echo "Missing arguments!"
help
;;
esac
done
if [ $TYPE = "false" ]
then {
        echo "Missing type"
        help
}
else {
        if [ $FILE = "false" ] && [ $URL = "false" ]
        then {
                echo "Must specify the filename or url"
                help
        }
        else {
                if [ $FILE != "false" ] &&  [ $URL != "false" ]
                then {
                        echo "filename and url can't be specify together"
                        help
                }
                fi
        }
        fi
}
fi
#main
if [ $FILE != "false" ]
then {
        if [ -e $FILE ]
        then awkfile $FILE $TYPE
        else {
                echo "No such file!"
                exit 1
        }
        fi
}
else processurl $URL $TYPE
fi

主要用到的就是awk进行文本的分析,大部分的shell是用来分析参数的,在写这个脚本的时候基本是边学边写的,也弄懂了不少东西。有时间的时候会写一个详细的分析解释

代码下载

04-06
2007
loading...