Linux中常用文件字符串分析的命令

linux中文件管理与系统管理的方面,经常会用到要从一个文件中或者一长串字符串中提取你所需要的数据,或者某些字段来进行查看或者分析,作为一个初级linux小菜鸟,我大体总结整理了几个常用的分析命令,希望能互相交流与探讨下。

主要是管道命令中的几个命令: grepsedawkcutwcsplit,printf

由于篇幅有限,仅仅对每个命令常用的方法进行列举

数据流重定位:

1.标准输入:代码为0,使用<或者<<

2.标准输出:代码为1,使用>或者>>

3.标准错误输出:代码为2,使用2>或者2>>

输出中,>和2>当文件不存在则创建一个新的,否则就先清空文件内容,再将数据写入。

>>和2>>当文件不存在则创建新的,否则就将内容追加到原来的文件上。

例如ll /home >test 2>&1,这是一种把错误信息和正确内容同时输入到一个文件中。

输入中:cat > test,这个可以在命令行中输入内容,且最终将结果写入到test文件中,使用ctrl+d结束。

cat >cattest < ~/test,将test的内容直接写到cattest中,

cat >cattest <<"1",代表当遇到这个字符1的时候停止输入。

管道命令的基本用法

command1 | command2 | command3

管道命令可以直接在”|” 后面直接使用,也可以直接后面接要操作的文件数据名

1grep

它主要是将给定的字符串在要进行比对的文件数据中,进行字符串的查找,将符合条件的字符串打印出来,它主要是以行为单位进行处理的,最后以整行为单位来进行显示。

格式:

grep [-cinv] [-A] [-B] pattern filename

参数说明:
-c
: 只输出匹配的总次数
-i
: 忽略大小写
-n
: 仅仅显示匹配的行号,及匹配的行
-v
: 反向选择,显示没有keyword的行

-A: 后面加数字,为after,除了列出匹配的行,再将后续的n行列出来

-B: 后面加数字,为before,除了列出匹配的行,再将前面的n行列出来

Pattern为具体的要查找的字符串,如“root”或者是“正则表达式”

正则表达式:

^word 待查找的word在行首

word$ 待查找的word在行尾

. 代表任意一个字符

* 重复前一个字符0到无穷多次

[abc] 从字符集合中选取一个,仅仅有其中一个,即a或者b或者c

[n1-n2] ,从字符集合的选取范围内查属于其中的一个字符

[^list] 不属于该字符串的范围的字符

\{n,m\}, 连续nm个前一个字符

^$ 代表的是空行号

example

#获取行首字符为the的行

grep -n '^the' filename

#获取一个任意f???d字符串,使用三个.

Grep -n 'f...d' filename

#获取至少有2个“e”的字符,如feedgeeed

grep -n ‘feee*d’ filename

#获取一个空行号

grep -n '^$' filename

查看匹配的前后行

grep -5 'parttern' inputfile //打印匹配行的前后5行

grep -C 5 'parttern' inputfile //打印匹配行的前后5行

grep -A 5 'parttern' inputfile //打印匹配行的后5行

grep -B 5 'parttern' inputfile //打印匹配行的前5行

2sed

sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程

主要用来对数据进行替换,删除,新增,选取特定行,它主要是以行为单位的

格式:

sed [-nefr] [[n1[,n2]] function]

参数说明:
-n
: 使用安静(silent)模式,默认况下所有来自STDIN的数据都会显示在屏幕上,

加上-n则只有经过sed处理才显示

-e : 直接在命令行模式上进行sed的操作编辑,主要是多点编辑,一行可以处理多个命令
-f
: 直接将sed操作写在一个文件内,-f filename 则可以执行文件内sed操作

-r sed操作支持的是扩展正则表达式语法(默认为基础正则)

-i: 直接修改读取的文件内容,会真正的修改原始文档

操作说明: [n1[,n2]] function

function参数:

a :新增,a后面可以接字符串,字符串会在当前的下一行出现
c
:替换,c后面可以接字符串,这些字符串可以替换n1,n2之间的行
d
:删除,不需接任何内容
i
:插入,i后面接字符串,字符串在当前的上一行出现
p
:打印,打印某个选择的数据,通常与sed -n一起运行
s
:搜索,不但可以搜索,还可以替换,如:1,20s/old/new/g

sed后面的动作一定是要用‘’括住

example

#删除25行直接的数据

cat -n /etc/passwd | sed '2,5d'

#删除第2行到最后一行的数据

cat -n /etc/passwd | sed '2,$d'

#在第2行后加一条字符串,(在第二行前用2i)

cat -n /etc/passwd | sed '2a hello word'

sed执行动作的时候,读取到相应的function后即开始处理,后面若有字符串就当作是要操作的字符串

同时添加多行的时候,每一行数据后面紧跟”\”,单引号要最后使用

#将第2行到第5行替换为“hello world”

cat -n /etc/passwd | sed ‘25c hello world’

#将第2行到第5行打印出来

cat -n /etc/passwd | sed -n ‘25p’

#将部分数据的查找与替换

格式:sed ‘s/replacestring/newstring/g’

3.awk

awk是一个数字处理工具。相比于sed常常作用于一整行的处理,awk则比较倾向于将一行分为数个“字段”来处理。

awk 'pattern1{action1}pattern2{action2}pattern3{action3}...' filename

两者是可选的,如果没有模式,则action应用到全部记录,如果没有action则输出匹配全部记录。

3.1.模式

模式可以是以下任意一个:

1)正则表达式:使用通配符的扩展集。

2)关系表达式:关系运算符进行操作,可以是字符串或数字的比较,如$2>%1选择第二个字段比第一个字段长的行。

4)模式匹配表达式:用运算符~(匹配)~!(不匹配)

5)模式,模式:指定一个行的范围。该语法不能包括BEGINEND模式。

6BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。

7END:让用户在最后一条输入记录被读取之后发生的动作。

3.2. 操作

操作由一人或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内。

主要有四部份:

1)变量或数组赋值

2)输出命令

3)内置函数

4)控制流命令

awk内置变量:

NF : 每一行($0)拥有的字段总数
NR
:当前awk所处理的是“第几行”数据
FS :
当前分隔符,默认空格键

在每一行的每个字段都是有变量名称的,如$1,$2,$3。。

如:

last -n | awk '{ print $1 “\t lines: ” NR “\t columes :” NF}'

awk中,后续动作都是由单引号括住的,在print中,非变量的文字部分,必须要使用双引号来定义。

awk -F":" '{ print $1 }' /etc/passwd

上例中,在调用 awk 时,使用 -F 选项来指定 ":" 作为字段分隔符

4.cut

cut是将一段信息切割出来,将同一行的数据进行分解,它一

般输出的是符合条件的字段,并不是一整行的数据,以行为处理单位,输出主要是以字段为单位,也就是输出的仅仅是行的一部分数据,主要用于分析log文件

格式:

cut -d '' -f fileds

cut -c 字符范围

参数:
-d
:后面接分隔符,与-f一起使用
-f
:根据-d的分隔符将一段消息分为数段,-f表出取出第几段
-c
:以字符为单位取出固定的字段范围

example

#输出分割后的3和第5

echo $PATH | cut -d ':' -f 3,5

#path中第13个字符后的字符串输出

echo $PATH| cut -c 12-

5.Sort

sort主要是用来进行排序的

格式:sort[-fbMnrtuk] [file or stdin]

参数:

-f:忽略大小写的差异,例如Aa视为编码相同;

-b:忽略最前面的空格符部分;

-M:以月份的名字来排序,例如JAN,DEC 等等的排序方法;

-n:使用『纯数字』进行排序(预设是以文字型态来排序的);

-r:反向排序;

-u:就是uniq,相同的数据中,仅出现一行代表;

-t:分隔符,预设是tab;

-k:以那个区间(field)来进行排序的意思,

example

cat/etc/passwd | sort -t ':' -k 3

6.Uniq

去掉重复的行,也可以理解为分组的作用。

格式:uniq[-ic]

参数:

-i:忽略大小写字符的不同;

-c:进行计数,主要就是统计相同行的数目

example

catiplog| uniq 相同的每一个只输出一次

catiplog|uniq -c 相同的每一个只输出一次,并且在每行首加上出现的次数

uniq去重是去相邻的行的,所以一般都需要sort

7.WC

WC主要用来对与文件里的字数,行数,字符数进行有效的统计

格式:wc[-lwm]

参数:

-l:仅仅列出行数

-w:仅仅列出多少字

-m:多少个字符

example

#列出passwd中的字数等

wcpasswd

2749 1439 passwd

输出的参数分别为:行数,字数,字符数,文件名

8split

当文件太大的时候记得来分割一下

格式:

split[-bl] file PREFIX

参数:

-b 以大小分割,b,k,m

-l 以行分割

PREFIX 代表分割后的文件名的前缀

example

#将文件分成300KB的文件,

split-b 300k /etc/termcap tersplit

最后分割后的文件都是tersplitaa, tersplitab,tersplitac

#将多个文件合并成一个文件

cattermcap* >>termcapback

>>是累加的数据流重定向模式

9 Comm两个文件的比较

如果想对两个有序的文件进行比较,使用Comm一般要先Sort以下

语法:comm [- 123 ] file1 file2
comm命令参数:
  -1   不显示只在第1个文件里出现过的列。
  -2   不显示只在第2个文件里出现过的列。
  -3   不显示只在第1和第2个文件里出现过的列。
  --help   在线帮助。
  --version   显示版本信息。
comm - 12就只显示在两个文件中都存在的行;
comm - 23只显示在第一个文件中出现而未在第二个文件中出现的行;