这篇文章是从我多年前的博客倒腾过来的,以后我会继续慢慢更新这篇文章。
1.ls
1)选项-1:所有结果显示为一列
2.grep
-c:只显示匹配结果的总行数
grep -c "gejun" test.txt
-v:不匹配选项
grep -v "UHCI" test.txt
显示不匹配UHCI的行
cat ./test.log | grep -v 'XXX'
过滤不含有XXX的文本
grep test * -r
-i 是忽略大小写
-r 是递归搜索目录
精确匹配
grep '\<要搜索的字符串\>' * -R
其他:
grep -nr * "aa\|bb\|cc\|dd"
aa 或 bb 或 cc 或 dd
grep -nr * ^a
首字符是 a
3.awk
1)基本方法:
echo $disksize | awk -F \" '{
printf "%s",$2
}'
这句话的含义:
以"为分隔符分析disksize字符串的值。
例:disksize="ge\"jun" 则结果应该为jun
2)grep与awk联合使用:效果是取文本文件中特定行的特定列的值,类似于sql中的选择和投影。
例:
cat test.txt | grep RecordNo | grep -v HuaYi | awk -F = '{
printf "%s",$2
}'
3)ls只显示目录名
ls -l | awk '/^d/ { printf "%s\n",$9 }'
^d:意为匹配行首为d的行
4) awk脚本可以用sub函数替代删除操作。
cat genReportsGUIAudit.cpp | awk -F = '{
if ($0~/qWideChar2UTF8String\(ToCVString\(/) {
str = $0
sub("qWideChar2UTF8String\(ToCVString\(","qWideChar2UTF8String(",str)
sub(/\).c_str\(\)/,"",str)
printf "%s\n", str
}
else
printf "%s\n", $0
}' > genReportsGUIAudit.cpp.bak
4.dd
可以指定跳过输入或输出流的字节数,例如下面就是跳过输入流一个block.
dd if=$mountdev of=$tmploopfile bs=1M count=`expr $size - 1` skip=1
5. vim
1) :u 就是 undo ,这条命令可以直接输入 u 不必加 :
2) :set noic 大小写敏感
3) :set nu 显示行号
4) N 上一个搜索结果,n 下一个搜索结果
5) :/\<待搜索字符串\> 全词匹配
6) :n,$s/被替换字符串/替换字符串/g,n 表示从第 n 行开始替换
:1,$s/\,/\, /g 把“,”替换为“, ”,注意转义符在这里的使用
:1,$s/^M//g 怎么替换“^M”?^M 注意要用 Ctrl + V 和 Ctrl + M 来输入
7) 调出历史命令列表 q:
8) Ctrl-R: Redo
9) % 括号匹配
10) wq! 编辑只读文件,保存的时候用这条命令。
11) vim 怎么打开多个文件?直接 vim *.xxx
12) 怎么删除每行第一个字符?:%s/^.//g
13) 格式化 C 代码, gg=G
14) guw 把光标后面的单词转为小写
15)
进入二进制编辑模式 :%!xxd
退出二进制编辑模式 :%!xxd -r
16) 高亮搜索结果 :set hlsearch
17) :bn :bp 显示下一个和前一个打开的文件,ctrl + 6 显示下一个文件,e XXX 打开一个文件
18) :!命令 执行shell的命令
19) :w!命令保存只读文件
20) set list 显示换行符回车符等等
21) set tabstop=4 设置tab的缩进
22) 常用的vim配置
1 set nu
2 set hlsearch
3 cs add cscope.out
4 set history=1000
5 hi Comment term=bold ctermfg=6 guifg=DarkCyan
6 set tabstop=4
23) ls 显示打开文件列表,b1 b2 文件切换
24) gnw case conversion
6. df
df -ah
7. wc
下面这条命令可以统计当前目录下所有文件的总行数。
wc -l ./*
8. ldd
linux 查看可执行文件依赖的动态链接库用 ldd
9. cat
用 cat 合并文件: cat *.xxx > 新文件名
10. watch -n XXX "command"
可以对command做类似top的监视
11. sed -i "s/oldstring/newstring/g" `grep oldstring -rl .`
批量替换字符串
例如,sed -i bak "s/#include \"deviceapis\/services\/student\/DataService\.h\"/#include \"deviceapis\/services\/shared\/DataService\.h\"/g" `grep "DataService.h" -rl .`
12. diff file1 file2 -b
忽略空格比较
13. 查看文本文件中间的内容
tail与head结合使用
如,cat xxx.txt | tail -n 1000 | head -n 100
14. dc计算器
加了16op后,可以输出16进制hex
echo $((1<<2)) 16op|dc
15. bc计算器
下面的例子做浮点运算
echo "1.55 - 0.00625 * 2"|bc
其他.shell小技巧:
1)判断一字符串是否为空:
[ -z "$removable" ]
注意,这里要加双引号。否则removable如果包含空格的话就会出错。
例:removable=ge jun
用不加双引号的[ -z $removable ]判断就会出错
2)生成随机数
cat /dev/urandom | head -n 1 | md5sum | head -c 8
3)怎么取一个变量的前几个字符
${var:n:m}
取var包含的字符串的从n开始的m个字符。
4)取文本的前几行或者一行的前几个字符
cat test.txt | head -n 1 | head -c 8
5)shell变量:
关于shell变量在cu上发了个帖子。下面做了些整理。
注意在shell中的管道会开一个新进程,从而可能使得shell变量失效。
例如下文中的嵌套循环。解决方法可以参考第二个回帖。
a)原帖:
下文这段简单的脚本中test变量的值最终应该显示为“changed”但不知为什么就是显示成“init”,
我调试的头都快爆了,也找不到原因
请各位帮我看看 谢谢!
#!/bin/sh
while [ 1 ] ;do
test="init"
ls -1 | \
while read devline;do
test="changed"
break
done
echo $test
break
done
b)smallstar001回帖:
#!/bin/sh
while [ 1 ] ;do
test="init"
ls -1 | \
while read devline;
do
echo $devline
test="changed"
a=2
break
done
echo $a
echo $test
break
done
[root@CCOSS_310968054 shl]# sh test2.sh
arr.sh
init
[root@CCOSS_310968054 shl]#
看看就明白了,子shell是没法修改父shell的东西的
c)seeLnd 的回帖:
#!/bin/sh
while [ 1 ] ;do
test="init"
while read devline;do
test="changed"
break
done <<<$(ls -1)
echo $test
break
done
6)获取name="value"的value部分的值有什么好办法吗?在cu上发了个帖子,问题和答案如下:
问题:
value="123456"
请问这种格式的字符串有什么好办法取123456呢?我现在使用awk来取,效率有点低。
方法如下:
echo "value=\"123456\"" | awk -F = '{
printf "%s", $2
}'
谢谢。
答案:
$ str='value="123456"'
$ echo $str
value="123456"
$ echo ${str#*=}
"123456"
7)部分技巧可以参考这篇小文:
http://thinkoftrain.spaces.live.com/blog/cns!C812D47081EEE59C!1599.entry
8)怎么输出一个空行?
echo -e "\n"
9)变量赋值等号前后不要有空格
比如:RESULT = "test" , 这样就会有问题。
10)算术运算需要多加一层括号:
VAL1=1
VAL2=2
RTCRESULT=$(($VAL1 - $VAL2))
11)ctrl + a / e 用来移动光标到 shell 输入的行首或者行尾。
12)下面是一份 awk 的脚本代码
示范了正则表达式,字符串函数的使用。
cat ./$TARFILE | grep "Abhijeet_AMDOCS" | awk -F = '{
if ($1~/cost time/)
costtime=substr($2,1,index($2,",")-1);
if ($2~/cpu_usage/)
cpuusage=substr($3,1,index($3,",")-1);
if ($3~/addr/)
addr=$4;
if ($0~/1 3 6 /) {
oid=substr($0,index($0,"1 3 6 "));
gsub(" ",".",oid);
oid=substr(oid,1,index(oid,"..")-1);
}
if ($0~/1 3 6 /) {
printf "%s,%s,%s,%s,%s,%s,%s\n",oid,costtime,cpuusage,addr,(vlagisldown~/1/)?"vlagisldown":"",(vlaghealthdown~/1/)?"vlaghealthdown":"",(lacpdown~/1/)?"lacpdown":""
vlagisldown="0";
vlaghealthdown="0";
lacpdown="0";
}
if ($0~/vLAG ISL is DOWN/) {
vlagisldown="1";
}
if ($0~/Health check is Down/) {
vlaghealthdown="1";
}
if ($0~/LACP is down/) {
lacpdown="1";
}
}' > $TARFILE.res
13)下面是一份 awk 的脚本代码
示范了如何在 awk 中做字符串的合并。
#!/bin/sh
TARFILE=./$1
cat ./$TARFILE | grep "Abhijeet_AMDOCS" | awk -F = '{
oidurlpre="http://tools.cisco.com/Support/SNMP/do/BrowseOID.do?objectInput="
oidurlpost="&translate=Translate&submitValue=SUBMIT&submitClicked=true"
timestamp=substr($0,1,index($0,"Abhijeet_AMDOCS")-1);
if ($1~/cost time/)
costtime=substr($2,1,index($2,",")-1);
if ($2~/cpu_usage/)
cpuusage=substr($3,1,index($3,",")-1);
if ($3~/addr/)
addr=substr($4,1,index($4,",")-1);
if ($0~/1\.3\.6\./) {
oid=substr($0,index($0,"1.3.6."));
oid=substr(oid,1,index(oid,"..")-1);
oidurl=oidurlpre oid oidurlpost;
}
if ($0~/1\.3\.6\./) {
printf "%s,%s,%s,%s,%s,%s,%s,%s,%s\n",timestamp,oid,costtime,cpuusage,addr,(vlagisldown~/1/)?"vlagisldown":"",(vlaghealthdown~/1/)?"vlaghealthdown":"",(lacpdown~/1/)?"lacpdown":"",(vlagisldown~/1/ || vlaghealthdown~/1/ || lacpdown~/1/)?oidurl:""
vlagisldown="0";
vlaghealthdown="0";
lacpdown="0";
}
if ($0~/vLAG ISL is DOWN/) {
vlagisldown="1";
}
if ($0~/Health check is Down/) {
vlaghealthdown="1";
}
if ($0~/LACP is down/) {
lacpdown="1";
}
}' > $TARFILE.csv
14)下面是一份示范如何在 shell 里面读取文件的脚本代码
#!/bin/sh
while read LINE
do
./parse.sh $LINE
done < $1
15)有时候程序输出 "XXX \r\n" 的时候会引起 awk 没法正常解析。这是要把 "\r" 过滤掉才能正常解析
16)set | grep XXX 可以用来查环境变量
17)解压缩bz2
tar -xjf XXX.bz2
18)如果遇到grep不支持-r的情况,可以用
find . | xargs grep XXX
19)find . 列出当前目录的所有文件,很实用
20)set -o emacs 切换到emacs风格的bash
21)which可以看到执行文件的全路径
22)set 可以看到当前所有的环境变量
23)命令的返回值在$?