日常shell使用小结

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}'
 
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,文件名注意双引号引用,如果追加用>>
 
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

4. awk中match()函数
1. match函数的使用
三个参数从左到右依次为输入行 正则表达式 匹配子函式(如存在多个子函式则需填入数组)
注意此处子函式的理解是正则表达式的子函式的理解 而非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 ="&nbsp; " prevline;
469         prevline ="&nbsp; " prevline;                        |469         }
470     }                                                         |470     }
471     prevline = prevline deblank[1];                           |471     prevline = prevline deblank[1];
2. match使用[]的坑
如下左侧代码应为匹配以制表符或四个空格起始的行
但实际打印发现当输入行是以制表符开始的行时deblank[1]非空 但当输入行是以四个空格开始的行时deblank[1]为空
如果按如下右侧代码分开写则可以正常运行
那么只能怀疑[]的解析与其它正则的解析不同了
具体原因待研究
457     deblank[0]= prevline;                                    |457     deblank[0]= prevline;
458     deblank[1]= prevline;                                    |458     deblank[1]= prevline;
459     prevline ="";                                            |459     prevline ="";
460     while(deblank[1]~/^\t|^\s{4}/){                         |460     while(deblank[1]~/^\t|^\s{4}/){
461         match(deblank[1],/^[\t|\s\s\s\s]{1}(.*)/, 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         }
468                                                               |468
469         prevline ="&nbsp; " prevline;                        |469         prevline ="&nbsp; " prevline;
470     }                                                         |470     }
471     prevline = prevline deblank[1];                           |471     prevline = prevline deblank[1];

 

 
 

 

 

 

posted @ 2018-02-22 21:13  Five100Miles  阅读(588)  评论(0编辑  收藏  举报