Linux Shell 文本管理工科具集锦【转】

本文将介绍Linux下使用Shell处理文本时最常用的工具,我对shell脚本使用的原则是命令单行书写,本文将介绍Linux下使用Shell处理文本时最常用的工具,我对shell脚本使用的原则是命令单行书写

澳门京葡网站 1

sed 文本替换利器

  • 首处替换

      seg 's/text/replace_text/' file   //替换每一行的第一处匹配的text
    
  • 大局替换

       seg 's/text/replace_text/g' file
    

    私下认可替换后,输出替换后的内容,要是要求直接调换原来的书文件,使用-i:

      seg -i 's/text/repalce_text/g' file
    
  • 移除空白行:

      sed '/^$/d' file
    
  • 变量转换已特其他字符串通过标志&来援用.

    echo this is en example | seg 's/\w+/[&]/g'
    $>[this]  [is] [en] [example]
    
  • 子串相称标志第4个门道十分的括号内容使用标志 1 来引用

      sed 's/hello([0-9])/1/'
    
  • 双引号求值sed平时用单引号来援引;也可应用双引号,使用双引号后,双引号会对表明式求值:

      sed 's/$var/HLLOE/'
    

    当使用双引号时,大家能够在sed样式和替换字符串中指定变量;

    eg:
    p=patten
    r=replaced
    echo "line con a patten" | sed "s/$p/$r/g"
    $>line con a replaced
    
  • 任何示例字符串插入字符:将文件中每行内容(PEKSHA) 转变为 PEK/SHA

      sed 's/^.{3}/
    

迭代文件中的行、单词和字符

迭代文件中的行、单词和字符

wc 总括行和字符的工具

wc -l file // 总计行数
wc -w file // 总计单词数
wc -c file // 计算字符数

find 文件查找

  • 查找txt和pdf文件

      find . ( -name "*.txt" -o -name "*.pdf" ) -print
    
  • 正则情势查找.txt和pdf

      find . -regex  ".*(.txt|.pdf)$"
    

    -iregex: 忽视大小写的正则

  • 否定参数查找全部非txt文本

       find . ! -name "*.txt" -print
    
  • 点名搜索深度打字与印刷出当前目录的文书(深度为1)

      find . -maxdepth 1 -type f
    

找到后的三翻五次动作

  • 删除:
    删去当前目录下具备的swp文件:

      find . -type f -name "*.swp" -delete
    
  • 实行动作(强盛的exec)

      find . -type f -user root -exec chown weber {} \; //将当前目录下的所有权变更为weber
    

    注:{}是一个例外的字符串,对于每二个匹配的文书,{}会被替换来相应的文书名;
    eg:将找到的文件全都copy到另一个索引:

      find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD \;
    
  • 组成多个指令
    tips: 借使供给持续实行多个指令,能够将几个指令写成三个剧本。然后
    -exec 调用时实行脚本就可以;

      -exec ./commands.sh {} \;
    

澳门京葡网站 1

打字与印刷钦赐列

  • awk形式贯彻:

      ls -lrt | awk '{print $6}'
    
  • cut格局完成

      ls -lrt | cut -f6
    

用样式对awk处理的行开展过滤

awk ‘NR awk ‘NR==1,NR==4 {print}’ file #行号等于1和4的打印出来

awk ‘/linux/’ #含有linux文本的行(可以用正则表明式来钦赐,一流无敌)

awk ‘!/linux/’ #不带有linux文本的行

传送外界变量

var=1000
echo | awk '{print vara}' vara=$var #  输入来自stdin
awk '{print vara}' vara=$var file # 输入来自文件

在awk中应用循环

for(i=0;ifor(i in array){print array[i];}

eg:

以逆序的情势打字与印刷行:(tac命令的完结)

seq 9| 
awk '{lifo[NR] = $0; lno=NR} 
END{ for(;lno>-1;lno--){print lifo[lno];}
} '

2.迭代一行中的每二个单词

for word in $line;
do 
echo $word;
done

uniq 清除重复行

  • 清除重复行

      sort unsort.txt | uniq
    
  • 总括各行在文书中冒出的次数

      sort unsort.txt | uniq -c
    
  • 寻找重复行

      sort unsort.txt | uniq -d
    

    可钦赐每行中供给相比的再一次内容:-s 早先地方 -w 比较字符数

转自:

-print的定界符

暗中同意使用’n’作为文件的定界符;

-print0 使用”作为文件的定界符,那样就足以寻觅包涵空格的公文;

grep 文本寻觅

grep match_patten file // 暗中同意访谈匹配行

  • 常用参数
    -o 只输出相配的文件行 VS -v 只输出未有相称的文本行
    -c 总括文件中带有文本的次数

      grep -c "text" filename
    

    -n 打字与印刷相称的行号
    -i 找出时大意大小写
    -l 只打印文件名

  • 在密密层层目录中对文件递归寻找(程序员搜代码的最爱):

      grep "class" . -R -n
    
  • 非常多少个方式

      grep -e "class" -e "vitural" file
    
  • grep输出以\0作为结尾符的公文名:(-z)

      grep "test" file* -lZ| xargs -0 rm
    

cut 按列切分文本

  • 截取文件的第2列和第4列:

      cut -f2,4 filename
    
  • 去文件除第3列的全体列:

      cut -f3 --complement filename
    
  • -d 钦点定界符:

      cat -f2 -d";" filename
    
  • cut 取的界定N- 第N个字段到终极-M 第二个字段为MN-M N到M个字段

  • cut 取的单位-b 以字节为单位-c 以字符为单位-f
    以字段为单位(使用定界符)
  • eg:

      cut -c1-5 file //打印第一到5个字符
      cut -c-2 file  //打印前2个字符
    

3. 迭代每二个字符

${string:start_pos:num_of_chars}:从字符串中提取七个字符;(bash文本切块)
${#word}:再次回到变量word的尺寸

for((i=0;i<${#word};i++))
do
echo ${word:i:1);
done

本文为《linux Shell脚本战略》的读书笔记,文中主要内容和演示来自于
《linux
Shell脚本战略》;

Posted by: 大CC | 18NOV,2013
博客:blog.me115.com
微博:搜狐天涯论坛

print 打印当前进

  • 采纳不带参数的print时,会打字与印刷当前行;

      echo -e "line1nline2" | awk 'BEGIN{print "start"} {print } END{ print "End" }'
    
  • print 以逗号分割时,参数以空格定界;

    echo | awk ' {var1 = "v1" ; var2 = "V2"; var3="v3"; 
    print var1, var2 , var3; }'
    $>v1 V2 v3
    
  • 应用-拼接符的主意(””作为拼接符);

    echo | awk ' {var1 = "v1" ; var2 = "V2"; var3="v3"; 
    print var1"-"var2"-"var3; }'
    $>v1-V2-v3
    

sed 文本替换利器

  • 首处替换

      seg 's/text/replace_text/' file   //替换每一行的第一处匹配的text
    
  • 大局替换

       seg 's/text/replace_text/g' file
    

    暗中同意替换后,输出替换后的剧情,假诺须求直接交换原来的文章件,使用-i:

      seg -i 's/text/repalce_text/g' file
    
  • 移除空白行:

      sed '/^$/d' file
    
  • 变量转变
    已同盟的字符串通过标记&来引用.

    echo this is en example | seg 's/\w+/[&]/g'
    $>[this]  [is] [en] [example]
    
  • 子串相称标识
    率先个门当户对的括号内容使用标识 \1 来引用

      sed 's/hello\([0-9]\)/\1/'
    
  • 双引号求值
    sed经常用单引号来引用;也可使用双引号,使用双引号后,双引号会对表明式求值:

      sed 's/$var/HLLOE/'
    

    当使用双引号时,大家得以在sed样式和替换字符串中内定变量;

    eg:
    p=patten
    r=replaced
    echo "line con a patten" | sed "s/$p/$r/g"
    $>line con a replaced
    
  • 其余示例
    字符串插入字符:将文件中每行内容(PEKSHA) 调换为 PEK/SHA

      sed 's/^.\{3\}/&\//g' file
    

提供的事例和参数都以最常用和十二万分实用的;

xargs参数表达

-d 定义定界符 (默感觉空格 多行的定界符为 \n)
-n 钦赐输出为多行
-I {}
钦赐替换字符串,那么些字符串在xargs扩充时会被更改掉,用于待实践的下令须求多少个参数时
eg:

cat file.txt | xargs -I {} ./command.sh -p {} -1

-0:指定\0为输入定界符
eg:计算程序行数

find source_dir/ -type f -name "*.cpp" -print0 |xargs -0 wc -l

xargs参数表明

澳门京葡网站,-d 定义定界符 (默以为空格 多行的定界符为 n)

-n 钦点输出为多行

-I {}
内定替换字符串,这些字符串在xargs扩张时会被替换掉,用于待实行的指令须求八个参数时

eg:

cat file.txt | xargs -I {} ./command.sh -p {} -1

-0:内定为输入定界符

eg:总括程序行数

find source_dir/ -type f -name "*.cpp" -print0 |xargs -0 wc -l

内容目录:

  • find 文件查找
  • grep 文本搜索
  • xargs
    命令行参数转变
  • sort 排序
  • uniq 清除重复行
  • 用tr实行转移
  • cut 按列切分文本
  • paste
    按列拼接文本
  • wc
    总结行和字符的工具
  • sed 文本替换利器
  • awk
    数据流管理工科具
  • 迭代文件中的行、单词和字符

正文将介绍Linux下行使Shell管理文件时最常用的工具:
find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk;
提供的例证和参数都是最常用和极端实用的;
自己对shell脚本使用的尺度是命令单甲骨文写,尽量不要超越2行;
若果有越来越复杂的天职须要,依然思量python吧;

读取命令输出

利用getline,将表面shell命令的出口读入到变量cmdout中;

echo | awk '{"grep root /etc/passwd" | getline cmdout; print cmdout }'

cut 按列切分文本

  • 截取文件的第2列和第4列:

      cut -f2,4 filename
    
  • 去文件除第3列的全体列:

      cut -f3 --complement filename
    
  • -d 钦定定界符:

      cat -f2 -d";" filename
    
  • cut 取的界定
    N- 第N个字段到终极
    -M 第二个字段为M
    N-M N到M个字段

  • cut 取的单位
    -b 以字节为单位
    -c 以字符为单位
    -f 以字段为单位(使用定界符)
  • eg:

      cut -c1-5 file //打印第一到5个字符
      cut -c-2 file  //打印前2个字符
    

设置定界符

运用-F来设置定界符(默感到空格)

awk -F: ‘{print $NF}’ /etc/passwd

用样式对awk管理的行举办过滤

awk ‘NR < 5’ #行号小于5
awk ‘NR==1,NR==4 {print}’ file #行号等于1和4的打字与印刷出来
awk ‘/linux/’ #包含linux文本的行(能够用正则表明式来钦命,一流无敌)
awk ‘!/linux/’ #不含有linux文本的行

awk常用内建函数

index(string,search_string):返回search_string在string中现身的岗位

sub(regex,replacement_str,string卡塔尔国:将正则相配到的第一处剧情替换为replacement_str;

match(regex,string卡塔尔国:检查正则表达式是或不是能够匹配字符串;

length(string卡塔尔:重回字符串长度

echo | awk '{"grep root /etc/passwd" | getline cmdout; print length(cmdout) }'

printf 肖似c语言中的printf,对输出进行格式化

eg:

seq 10 | awk '{printf "->%4sn", $1}'

安装定界符

动用-F来安装定界符(默感觉空格)
awk -F: ‘{print $NF}’ /etc/passwd

3. 迭代每贰个字符

${string:start_pos:num_of_chars}:从字符串中领到一个字符;(bash文本切块)

${#word}:再次来到变量word的长短

for((i=0;i<${#word};i++))
do
echo ${word:i:1);
done

sort 排序

字段表达:
-n 按数字实行排序 VS -d 按词典序进行排序
-r 逆序排序
-k N 钦点按第N列排序
eg:

sort -nrk 1 data.txt
sort -bd data // 忽略像空格之类的前导空白字符

sort 排序

字段表明:

-n 按数字进行排序 VS -d 按词典序进行排序

-r 逆序排序

-k N 钦命按第N列排序

eg:

sort -nrk 1 data.txt
sort -bd data // 忽略像空格之类的前导空白字符

awk实现head、tail命令

  • head:

      awk 'NR<=10{print}' filename
    
  • tail:

      awk '{buffer[NR%10] = $0;} END{for(i=0;i<11;i++){ \
      print buffer[i %10]} } ' filename
    

paste 按列拼接文本

将八个文件按列拼接到一齐;

cat file1
1
2

cat file2
colin
book

paste file1 file2
1 colin
2 book

默许的定界符是制表符,能够用-d指明定界符

paste file1 file2 -d “,”

1,colin

2,book

find 文件查找

  • 查找txt和pdf文件

      find . \( -name "*.txt" -o -name "*.pdf" \) -print
    
  • 正则形式查找.txt和pdf

      find . -regex  ".*\(\.txt|\.pdf\)$"
    

    -iregex: 忽略大小写的正则

  • 否定参数
    寻觅全体非txt文本

       find . ! -name "*.txt" -print
    
  • 点名寻觅深度
    打字与印刷出当前目录的文书(深度为1)

      find . -maxdepth 1 -type f