Shell 常用文本处理命令

grep

如果要使用正则表达式需要加上参数  grep -E "[a-z]+"  #使用正则表达式

或者  egrep "[a-z]+"

-A  -B  输出匹配到行前面或后面的几行  -C 则可以同时显示前后几行

-e  匹配多个样式,如 grep -e "cat" -e "dog" file

-i  忽略文本的大小写

-o  只输出文本中匹配到的文本

-c  统计匹配到的行数(注意不是次数)如果要统计匹配到次数,可以使用 echo -e "1 2 3 4\nhello\n5 6" | egrep -o "[0-9]" | wc -l

-l  找出某一个字符串出现的文件名

-n  输出行数

-R  在目录中多级递归搜索

--include  在特定文件中搜索 如 --include *.{c,cpp}

-q  静默输出

cut

按列切分文件

-f1,2,3  显示第1,2,3列的数据

-d       指定列分隔符

-c1-5,6-9 --output-delimiter ","   显示第1-5和7-9个字符

sed

sed 是一种在线编辑器,它一次处理一行内容。常用来将数据行进行替换删除、新增、选取等特定工作。

常用选项:

-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。

-e∶直接在指令列模式上进行 sed 的动作编辑;

-f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;

-r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)

-i∶直接修改读取的档案内容,而不是由萤幕输出。

常用命令:

a   ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~

        c   ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!

d   ∶删除,因为是删除,所以 d 后面通常不接任何咚咚;

i   ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);

p  ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~

s  ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

举例:(假设我们有一文件名为ab)

删除某行

   [[email protected] ruby] # sed ‘1d‘ ab              #删除第一行 

[[email protected] ruby] # sed ‘$d‘ ab              #删除最后一行

[[email protected] ruby] # sed ‘1,2d‘ ab           #删除第一行到第二行

[[email protected] ruby] # sed ‘2,$d‘ ab           #删除第二行到最后一行

  显示某行

.    [[email protected] ruby] # sed -n ‘1p‘ ab           #显示第一行 

[[email protected] ruby] # sed -n ‘$p‘ ab           #显示最后一行

[[email protected] ruby] # sed -n ‘1,2p‘ ab        #显示第一行到第二行

[[email protected] ruby] # sed -n ‘2,$p‘ ab        #显示第二行到最后一行

  使用模式进行查询

     [[email protected] ruby] # sed -n ‘/ruby/p‘ ab    #查询包括关键字ruby所在所有行

[[email protected] ruby] # sed -n ‘/\$/p‘ ab        #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义

  增加一行或多行字符串

[[email protected] ruby]# cat ab

Hello!

ruby is me,welcome to my blog.

end

[[email protected] ruby] # sed ‘1a drink tea‘ ab  #第一行后增加字符串"drink tea"

Hello!

drink tea

ruby is me,welcome to my blog.

end

[[email protected] ruby] # sed ‘1,3a drink tea‘ ab #第一行到第三行后增加字符串"drink tea"

Hello!

drink tea

ruby is me,welcome to my blog.

drink tea

end

drink tea

[[email protected] ruby] # sed ‘1a drink tea\nor coffee‘ ab   #第一行后增加多行,使用换行符\n

Hello!

drink tea

or coffee

ruby is me,welcome to my blog.

end

 代替一行或多行

[[email protected] ruby] # sed ‘1c Hi‘ ab                #第一行代替为Hi

Hi

ruby is me,welcome to my blog.

end

[[email protected] ruby] # sed ‘1,2c Hi‘ ab             #第一行到第二行代替为Hi

Hi

end

 替换一行中的某部分

 格式:sed ‘s/要替换的字符串/新的字符串/g‘   (要替换的字符串可以用正则表达式)

[[email protected] ruby] # sed -n ‘/ruby/p‘ ab | sed ‘s/ruby/bird/g‘    #替换ruby为bird

   [[email protected] ruby] # sed -n ‘/ruby/p‘ ab | sed ‘s/ruby//g‘        #删除ruby

插入

[[email protected] ruby] # sed -i ‘$a bye‘ ab         #在文件ab中最后一行直接输入"bye"

[[email protected] ruby]# cat ab

Hello!

ruby is me,welcome to my blog.

end

bye

awk

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。

简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理

awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。

基本语法: awk ‘{pattern + action}‘ {filenames}

#last -n 5 | awk  '{print $1}'
root
root
root
dmtsai
root

awk工作流程是这样的:读入有‘\n‘换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或 "[tab]键",所以$1表示登录用户,$3表示登录用户ip,以此类推。

cat /etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}'
name,shell
root,/bin/bash
daemon,/bin/sh
bin,/bin/sh
sys,/bin/sh

awk工作流程是这样的:先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。

awk内置变量

awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。

ARGC               命令行参数个数

ARGV               命令行参数排列

ENVIRON            支持队列中系统环境变量的使用

FILENAME           awk浏览的文件名

FNR                浏览文件的记录数

FS                 设置输入域分隔符,等价于命令行 -F选项

NF                 浏览记录的域的个数

NR                 已读的记录数

OFS                输出域分隔符

ORS                输出记录分隔符

RS                 控制记录分隔符

统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:

#awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/bin/sh
filename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/sh
filename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/sh

统计某个文件夹下的文件占用的字节数

ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'
[end]size is  8657198

如果以M为单位显示:

ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size/1024/1024,"M"}'
[end]size is  8.25889 M

注意,统计不包括文件夹的子目录。

条件语句

awk中的条件语句是从C语言中借鉴来的,见如下声明方式:

if (expression) {

statement;

statement;

... ...

}

if (expression) {

statement;

} else {

statement2;

}

if (expression) {

statement1;

} else if (expression1) {

statement2;

} else {

statement3;

}

统计某个文件夹下的文件占用的字节数,过滤4096大小的文件(一般都是文件夹):

ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size=size+$5;}} END{print "[end]size is ", size/1024/1024,"M"}'
[end]size is  8.22339 M

循环语句

awk中的循环语句同样借鉴于C语言,支持while、do/while、for、break、continue,这些关键字的语义和C语言中的语义完全相同。

数组

因为awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key)。值和关键字都存储在内部的一张针对key/value应用hash的表格里。由于hash不是顺序存储,因此在显示数组内容时会发现,它们并不是按照你预料的顺序显示出来的。数组和变量一样,都是在使用时自动创建的,awk也同样会自动判断其存储的是数字还是字符串。一般而言,awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等。

显示/etc/passwd的账户

awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
0 root
1 daemon
2 bin
3 sys
4 sync
5 games
......

这里使用for循环遍历数组

时间: 2025-01-14 23:35:15

Shell 常用文本处理命令的相关文章

Linux Shell处理文本的命令大全

本文将介绍Linux下使用Shell处理文本时最常用的工具:find.grep.xargs.sort.uniq.tr.cut.paste.wc.sed.awk:提供的例子和参数都是最常用和最为实用的,我对shell脚本使用的原则是命令单行书写,尽量不要超过2行:如果有更为复杂的任务需求,还是考虑python吧! find文件查找 查找txt和pdf文件 找txt和pdf文件 find . ( -name "*.txt" -o -name "*.pdf" ) -pri

linux常用文本编缉命令

strings--读出文件中的所有字符串 sed--文本编缉 类型 命令 命令说明 字符串替换 sed -i 's/str_reg/str_rep/' filename 将文件每一行第一个str_reg字符组替换为str_rep 字符串替换 sed -i 's/str_reg/str_rep/g' filename 将文件每一行所有str_reg字符组替换为str_rep 行删除 sed -i '2d' filename 将文件当前的第二行删除 行删除 sed -i '2,5d' filenam

shell用到的命令(1)——“AND(&&)”,“OR(||)”,“:”,&quot;.&quot;

shell常用到的命令: 1.AND列表与OR列表: 1).AND列表(&&): 在前一条命令执行成功时才执行下一条命令. 当有一个执行失败时,直接反回"失败码". 使用: 语句1 && 语句2 && 语句3 && ..... 2).OR列表(||): 与&&相反,当前一条语句执行失败后才执行下一条语句. 使用: 语句1 || 语句2 || 语句3 || ..... 3).上面两个可以进行组合,进行逻辑处理

SHELL常用命令总结

http://blog.chinaunix.net/uid-25311424-id-2956521.html 一.mkdir命令 1.用途:创建目录 2.参数: (1).-p :如果路径中的某些目录不存在,则会自动创建目录,默认的mode由执行环境中的umask决定,即mode = 0777 - umask;无参数则路径中的目录不存在则将无法创建 (2).-m : 指定目录的权限; 3.例子: 示例一 [[email protected] ~]# umask 0022 [[email prote

shell 常用命令语法简介

一.grep用法 ************************************** ++++++用一些特殊的函数来处理参数++++++ *$# 传递给函数的参数个数 *$* 显示所有传递给函数的参数 *[email protected] 与$*相同但略有不同 *$? 函数的返回值 ************************************** 1.grep一般格式 grep [选项] 基本正则表达式 [文件] 2.双引号引用 在grep命令中输入字符串参数时,最好将其用

Linux Shell处理文本最常用的工具大盘点

导读 本文将介绍Linux下使用Shell处理文本时最常用的工具:find.grep.xargs.sort.uniq.tr.cut.paste.wc.sed.awk:提供的例子和参数都是最常用和最为实用的,我对shell脚本使用的原则是命令单行书写,尽量不要超过2行:如果有更为复杂的任务需求,还是考虑python吧! find文件查找 查找txt和pdf文件 找txt和pdf文件 find . \( -name "*.txt" -o -name "*.pdf" \)

adb shell常用命令

adb shell常用命令: 按下OK键   device.press('KEYCODE_DPAD_CENTER','DOWN_AND_UP') 长按某个按键:  device.drag((236,440),(236,440),2,10) 相应的按键对应的名称如下: home键:KEYCODE_HOME back键:KEYCODE_BACK send键:KEYCODE_CALL End键:   KEYCODE_ENDCALL 上导航键:KEYCODE_DPAD_UP 下导航键:KEYCODE_D

Shell 常用命令

Shell 常用命令 这篇博客记录了一些 Shell 常用命令 供未来查阅. 添加ll 为了简化 "ls -l",可以在~/.bash_profile中加入: 1 2 alias ll='ls -l' 获得参数 $0是命令本身$1是第一个参数 $ $可以认为是 获取内容 . 内置变量 bash有很多内置变量,我们可以使用$获取到它们,例如: 1 2 3 4 5 $PWD $HOME $PATH $(pwd) 读取配置 配置数据可以像下面一样: 1 2 3 4 Fansy:UtilToo

hbase shell常用命令

hive常用命令 show tables; 列出hive里面所有数据表名 desc userProfile; 显示数据表userProfile的基本表字段及字段type desc extended trackinfo; 显示数据表trackinfo的详细信息,包括字段说明,数据表等 /usr/local/cloud/hive/bin/hive 进入hive数据库 select attribute_name from pms_attribute where attribute_id=21000 a