1. linux下文件转码(GB2312转UTF8)
vim打开文件后set fileencoding=utf-8 适用打开单个文件修改的情况
iconv -f GBK -t UTF-8 input -o output 使用iconv转码, 适用脚本中批处理生成带BOM的UTF8文本
echo -e -n "\xef\xbb\xbf" > file 以二进制方式将BOM标记写到file中, 再将真正的文件内容写入file
2. awk使用技巧
awk + regexp
awk也可以使用正则,之前一直没结合试过,今次用了以后才发现方便之处
使用方法:用/包括的内容即正则表达式 与正则表达式比较时需用~表示匹配(!~表示不匹配) 其余同shell下表达式写法
i.e.
打印hisi vo信息,只选取标题与第三通道信息
cat /proc/umap/vo | awk -F\ '{if($1~/[^0-9]+/ || $2=="3")print $0}'
对比下不使用正则的办法
cat /proc/umap/vo | awk -F\ '{if(($1!="0"&&$1!="1"&&$1!="3") || $2=="3")print $0}'
打印hisi vpss信息,只选取标题与第三通道信息 注意退格用\t
cat /proc/umap/vpss | awk -F\ '{if ($1~/[^0-24-9]+/)print "VpssGrp:\t" $0}'
使用方法:用/包括的内容即正则表达式 与正则表达式比较时需用~表示匹配(!~表示不匹配) 其余同shell下表达式写法
i.e.
打印hisi vo信息,只选取标题与第三通道信息
cat /proc/umap/vo | awk -F\ '{if($1~/[^0-9]+/ || $2=="3")print $0}'
对比下不使用正则的办法
cat /proc/umap/vo | awk -F\ '{if(($1!="0"&&$1!="1"&&$1!="3") || $2=="3")print $0}'
打印hisi vpss信息,只选取标题与第三通道信息 注意退格用\t
cat /proc/umap/vpss | awk -F\ '{if ($1~/[^0-24-9]+/)print "VpssGrp:\t" $0}'
awk文档参考: http://www.gnu.org/software/gawk/manual/gawk.html
TIPS:
单独写awk脚本时头部需添加#! /bin/awk -f
分隔符的设置: awk -F xxx 或 awk 'BEGIN{ FS = xxx }...' 前一种注意转义字符的含义,后一种注意要放在BEGIN段
以单个字符分隔: awk -F "" ...
以一行整体分隔: awk -F "\n" ...
输出分隔符: awk 'BEGIN{a=0;b=0;OFS=" "}END{print a, b}' 设置OFS,另外a与b之间加逗号
输出到文件的方法: -dxxx 输出dump信息到xxx(携带awk自带环境变量) print a > "xxx" 将打印输出到xxx,文件名注意双引号引用,如果追加用>>
TIPS:
单独写awk脚本时头部需添加#! /bin/awk -f
分隔符的设置: awk -F xxx 或 awk 'BEGIN{ FS = xxx }...' 前一种注意转义字符的含义,后一种注意要放在BEGIN段
以单个字符分隔: awk -F "" ...
以一行整体分隔: awk -F "\n" ...
输出分隔符: awk 'BEGIN{a=0;b=0;OFS=" "}END{print a, b}' 设置OFS,另外a与b之间加逗号
输出到文件的方法: -dxxx 输出dump信息到xxx(携带awk自带环境变量) print a > "xxx" 将打印输出到xxx,文件名注意双引号引用,如果追加用>>
3. vim常用操作
将abc替换为ABCabc
/abc
:s//ABC& 或:s//ABC\0
将abc替换为abcABC
使用例1的方法,或
/abc
:s//\=submatch(0)."ABC" 注意\=表达式只能用在替换字符串起始位置,所以例1未使用此方法 详情见:h :s\=
将abc替换为ABCabABC
没想到好方法,笨办法是先替换为ABCabcABC再替换为ABCabABC
vim批量修改
将以abcxxxABC.c(其中xxx为数字)文件中的svn冲突标记删除(不包含1开头的系列)
:args abc[^1]?*ABC.c
/<<<<<<< .working
:argdo g//d
如果提示未保存,可以先:set hidden 然后:argdo :w
/^=======$ (注意别找到注释里的=======)
:argdo g// .,.+3 d
/abc
:s//ABC& 或:s//ABC\0
将abc替换为abcABC
使用例1的方法,或
/abc
:s//\=submatch(0)."ABC" 注意\=表达式只能用在替换字符串起始位置,所以例1未使用此方法 详情见:h :s\=
将abc替换为ABCabABC
没想到好方法,笨办法是先替换为ABCabcABC再替换为ABCabABC
vim批量修改
将以abcxxxABC.c(其中xxx为数字)文件中的svn冲突标记删除(不包含1开头的系列)
:args abc[^1]?*ABC.c
/<<<<<<< .working
:argdo g//d
如果提示未保存,可以先:set hidden 然后:argdo :w
/^=======$ (注意别找到注释里的=======)
:argdo g// .,.+3 d
4. awk中match()函数
1. match函数的使用
三个参数从左到右依次为输入行 正则表达式 匹配子函式(如存在多个子函式则需填入数组)
注意此处子函式的理解是正则表达式的子函式的理解 而非awk那种分隔符的理解
具体以如下代码举例而言deblank[1]是指正则表达式匹配的第一个子函式(即第一个()中内容) deblank[2]是指正则表达式匹配的第二个子函式(即第二个()中内容)
即如果输入是以制表符开始的行则deblank[1]为制表符后内容deblank[2]为空 如果输入是以四个空格开始的行则deblank[1]为空deblank[2]为四个空格后内容
三个参数从左到右依次为输入行 正则表达式 匹配子函式(如存在多个子函式则需填入数组)
注意此处子函式的理解是正则表达式的子函式的理解 而非awk那种分隔符的理解
具体以如下代码举例而言deblank[1]是指正则表达式匹配的第一个子函式(即第一个()中内容) deblank[2]是指正则表达式匹配的第二个子函式(即第二个()中内容)
即如果输入是以制表符开始的行则deblank[1]为制表符后内容deblank[2]为空 如果输入是以四个空格开始的行则deblank[1]为空deblank[2]为四个空格后内容
460 while(deblank[1]~/^\t|^\s{4}/){ |460 while(deblank[1]~/^\t|^\s{4}/){
461 match(deblank[1],/^\t{1}(.*)|^\s{4}(.*)/, deblank); |461 match(deblank[1],/^\t{1}(.*)|^\s{4}(.*)/, deblank);
462 print"=== " deblank[0] |462 print"=== " deblank[0]
463 print"+++ " deblank[1] |463 print"+++ " deblank[1]
464 print"--- " deblank[2] |464 print"--- " deblank[2]
465 if(deblank[1]==""){ |465 if(deblank[1]==""){
466 deblank[1]= deblank[2]; |466 deblank[1]= deblank[2];
467 } |467 }else{
468 |468 prevline =" " prevline;
469 prevline =" " prevline; |469 }
470 } |
461 match(deblank[1],/^\t{1}(.*)|^\s{4}(.*)/, deblank); |461 match(deblank[1],/^\t{1}(.*)|^\s{4}(.*)/, deblank);
462 print"=== " deblank[0] |462 print"=== " deblank[0]
463 print"+++ " deblank[1] |463 print"+++ " deblank[1]
464 print"--- " deblank[2] |464 print"--- " deblank[2]
465 if(deblank[1]==""){ |465 if(deblank[1]==""){
466 deblank[1]= deblank[2]; |466 deblank[1]= deblank[2];
467 } |467 }else{
468 |468 prevline =" " prevline;
469 prevline =" " prevline; |469 }
470 } |