shell编程中,经常需要将由特定分割符分割的字符串分割成数组,多数情况下我们首先会想到使用awk
但是实际上用shell自带的分割数组功能会更方便。假如
a=”one,two,three,four”
要将$a分割开,可以这样:
OLD_IFS=”$IFS”
IFS=”,”
arr=($a)
IFS=”$OLD_IFS”
for s in ${arr[@]}
do
echo “$s”
done
上述代码会输出
one
two
three
four
arr=($a)用于将字符串$a分割到数组$arr ${arr[0]} ${arr[1]} … 分别存储分割后的数组第1 2 … 项 ,${arr[@]}存储整个数组。变量$IFS存储着分隔符,这里我们将其设为逗号 “,” OLD_IFS用于备份默认的分隔符,使用完后将之恢复默认。
7.shell数值计算
[lvjun93@localhost SG]$ a=1
[lvjun93@localhost SG]$ let "a+=1"
[lvjun93@localhost SG]$ echo $a
2
8.
$0就是该bash文件名
$?是上一指令的返回值
一般如果是 0 表示 运行正确,
非0 表示运行出错
$*所有位置参数的内容:就是调用调用本bash shell的参数。
$@基本上与上面相同。只不过是
“$*”返回的是一个字符串,字符串中存在多外空格。
“$@”返回多个字符串。
9.shell 字符串截取
[lvjun93@localhost SG]$ str="20130328"
[lvjun93@localhost SG]$ echo ${str:0:4}
2013
[lvjun93@localhost SG]$ echo ${str:4:2}
03
[lvjun93@localhost SG]$ echo ${str:6:2}
28
[lvjun93@localhost SG]$ echo ${#str}
8
10.求指定日期的下一天
#date -d "20110228 1 days" "+%Y%m%d"
20110301
#date -d "20110830 1 days" "+%Y%m%d"
20110831
获取当前时间---年月日时分秒
[@djt_6_3 script]$ date +%Y%m%d%H%M%S
求指定日期的前一天
date -d "20110228 1 days ago" "+%Y%m%d"
date -d "`date +%Y%m%d` 1 days ago" "+%Y%m%d"
11. bash echo 换行
echo -e "abc"
12.
lzop 解压命令
lzop -d recommender.err.log.2013-03-28_23.lzo -o recommender.err.log.2013-03-28_23
13 定时运行脚本命令
[@djt_6_3 etc]$ crontab -l
no crontab for lvjun
14
[@djt_6_3 script]$ cat recom_UIDlist_stat_2013-03-29|awk -F"UID=" '{print $2}'|awk -F"_L" '{print $1}'
15.
16.重定向标准输出到标准错误
[@djt_12_228 tools]$ ./test2.sh 2>&1 |tee test2.log
17.mkdir创建多级目录
mkdir -p
18.grep 的时候取反
awk '{print $3}' log_push_20130330.txt | grep "9774d56d682e549c_[^0-9a-z]"
19.
如果是要删除第三行:
sed -i '3d' 1.txt
如果删除以Love开头的行
sed -i '/^Love/d' 1.txt
删除包含Love的行
sed -i '/Love/d' 1.txt
-i选项就是作用到源文件,否则输出到标准输出
sed '/^.\{1,20\}$/d' file
sed -i '/^.\{1,35\}$/d' testfile
[@djt_12_228 ~]$ wc -l recom_click_uidlist_20130330
15448 recom_click_uidlist_20130330
[@djt_12_228 ~]$ sed -i '/^.\{1,38\}$/d' recom_click_uidlist_20130330
[@djt_12_228 ~]$ wc -l recom_click_uidlist_20130330
15434 recom_click_uidlist_20130330
20.文件每行结尾追加内容
sed -i 's/$/&[____]20130330_12:30:15/' testfile
sed 's/$/&\t20130330 12:30:15/' recom_click_uidlist_20130330.bak
21. sort 排序
$ sort -t = -k 2 query_log_20130330-20130331 >query_log_20130330-20130331.sorted
cp /search/wangpan/tools/recom_click_uidlist_20130330 .
21. 编码
set encoding=utf-8
22.
sort 1.txt | uniq -c | sort -k1nr>3.txt
[@djt_12_228 new_diff_case]$ echo "adBGF" |tr a-z A-Z
ADBGF
[@djt_12_228 new_diff_case]$ echo "adBGF" |tr A-Z a-z
adbgf
# 过滤掉所有标点符号(.、,、?、!)
$ sed 's/\.//g' -e 's/\,//g' -e 's/\?//g' -e 's/\!//g' myfile
cat zuqiu_query_org_col1 | tr A-Z a-z > zuqiu_query_org_col1.xiaoxie
sort zuqiu_query_org_col1.xiaoxie | uniq -c | sort -k1nr>zuqiu_query_org_col1.sorted
head -50 zuqiu_query_org_col1.sorted |awk '{print $2}' > zuqiu_query_org_col1.case
23.vi 如何跳到最后一行
shift +G
24.
scp -r root@10.10.122.76://search/zhangk/ontology_edit ./
25.
awk ' BEGIN{FS="\t"} { if (length($2) != 1)print $1"\t"$2}' ./sample1.txt >sample2.txt
26.程序后台运行
nohup 命令 &awk -F
27 . cat id_schema.txt |awk -F"\t" '{print $2}'|awk -F"_" '{print NF}' |grep 1
28.
cat id_schema.txt |awk -F"\t" '{print $2}'|awk -F"_" '{if(NF>=2) print $(NF-1)}'
cat id_schema.txt |awk -F"\t" '{print $2}'|awk -F"_" '{if(NF>=2)print $1$(NF-1);else print "abcd" }' > lei.txt
30
命令行选项 -F"[:/]" 告诉awk / 和 : 都是字段分隔符
31.
awk '{if ((($1==$2)||($2==-1))&&($3==$4)) print $5}' 16354.txt > yuhuo.txt
32
sort -t $'\t' -k2,2 bingyu_schema.txt.rmat > bingyu_schema.txt.rmat.sort
33. 压缩 tar -czvf lvjun.tar.gz lvjun
解压 tar -xzvf lvjun.tar.gz
34.更改目录或文件的用户权限
chown -R www-data:www-data lvjun
grops 查看用户所在组
35.编译boost多线程程序
g++ -o 1.out 1.cpp -I$BOOST_INCLUDE -L$BOOST_LIB -lboost_thread
36. 按行打乱一个文件
shuf -n 10 zhanxian.txt.20130715 -o out.txt
36. 取出两个文件的交集(只留下同时存在于两个文件中的文件)
cat file1 file2 | sort | uniq -d
37.获取指定行
sed -n '1,2p' sogou.html.20130724
3042110
sed -n ' 3042010, 3042210 p' sogou.html.20130724 >1.txt
38.把输出重定向到文件和屏幕
echo "abc" | tee a
39.编码转换
iconv -c -s -f utf8 -t gbk inputfile -o outputfile