澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

澳门新浦京娱乐场网站:Linux文本处理命令,sh

正则表达式&&文本管理利器

上学目的:

l  精通正则表明式的利用

l  驾驭sed、awk文本管理工科具的行使

目录结构:

 澳门新浦京娱乐场网站 1

 

 

Linux文本管理命令

豆蔻梢头. 确定地点命令

  1. shell登陆
    • /etc/profile
    • /etc/bashrc
    • /root/.bashrc
    • /root/.bash_profile
    • /etc/profile.d/a.sh
  2. 非shell登陆
    • /root/.bashrc
    • /etc/bashrc
    • /etc/profile.d/a.sh

知识点

  • sort
  • uniq
  • cut
  • wc
  • sed命令
  • awk命令
  • crontab定时器

安详严整正则表明式及Linux三大文本管理工科具,正则表明式linux

grep、sed和awk都是文本管理工科具,尽管都以文本管理工科具但却都有各自的得失,生机勃勃种文本管理命令是不能够被另一个一心替换的,不然也不会产出八个文本管理命令了。

生龙活虎、正则表明式

1、相配字符的品种

[a-z]:小写字母

[A-Z]:大写字母

[a-Z]:小或大写字母

[0-9]:数字

[a-zA-Z0-9]:表示卓殊三个为字母或数字的字符

. :相配1个随机字符,空格除此而外

[0-f]:16进制数

abc | def:abc或def
a (bc | de) f:abcf 或 adef

<:单词头 单词平常以空格或特殊字符做分隔,接二连三的字符串被看作单词

>:单词尾

[^表达式]:除小写字母以外的有着字符,如此类推。

2、后跟以下符号调控非常的数目

此类符号的右臂要有地方第一点的表明式

表达式*:0或n个字符

表达式 :1或n个字符

表达式?:0或1个字符

表达式{n}:n个字符

表达式{n:m}:n到m个字符

表达式{n,}:至少n个字符

【例】[a-z]*意味着相称0个或多个小写字母

3、将协作的字符调整在头尾
^表明式:尾部契合

发挥式$:尾巴部分符合

二、Linux三大文本管理工科具

1、egrep 筛选工具

grep的恢弘版,还可以正则表明式

语法:

egrep -选项  '正则表明式'  文件名

选项:

-n :展现行号
-o :只展现相配的源委
-q :静默格局,未有其余输出,得用$?来决断实施成功没有,即有未有过滤到想要的剧情
-l :如若相配成功,则只将文件名打印出来,退步则不打字与印刷,平日-rl一同用,grep -rl 'root' /etc
-A :假使相称成功,则将相称行及其后n行一同打字与印刷出来
-B :假若协作成功,则将相称行及其前n行一同打字与印刷出来
-C :尽管协作成功,则将相称行及其左右n行一齐打字与印刷出来
--color
-c :借使般配成功,则将特别到的行数打字与印刷出来
-i :忽视大小写
-v :取反,不匹配
-w:相称单词

2、sed 流编辑器

语法:

语法1:sed  -选项  '数字定位 命令'  文件名

选项:

-n:静默形式,不出口
-e:多项编辑,这一个不是很明亮
-i:直接退换文件内容,并非出口
-r:扩大格局,可使用正则表明式
-f:钦命文件名,将动作写在新的文件内

命令:

a ∶ 追加append,
c ∶ 改变change,
d ∶ 删除delete,
i ∶ 插入insert, i 的前面能够接字串,而这个字串会在新的大器晚成行现身(前段时间的上大器晚成行)
p∶ 列印print
s∶ 替代substitute,能够一贯开展更换的劳作。常常这一个 s 的动作能够搭配正则表明式。举个例子 1,20s/old/new/g

*s命令特别表达:

运用{命令1:命令2:命令3}可扩大使用多少个指令

语法2:sed  -r  '替换命令s/正则表达式/替换内容/贪婪选项g'  文件名

永世的二种办法:

①数字定位(输入行序号定位卡塔 尔(英语:State of Qatar)

十进制数
1:单行
1,3:范围 从第黄金年代行到第三行
2, 4:相称行后若干行
4,~3:从第四行到下叁个3的倍数行
2~3:第二行起每隔三行的行
$:尾行
1!:除了第生龙活虎行以外的行

【例】sed -n '1p' /etc/passwd

②正则表明式定位

正则必需用//包裹起来

推而广之正则须要用 -r 参数或转义

轮换可应用正则表达式的子方式,即小括号(卡塔尔,可以1、2代表子情势

【例】sed -r 's/(.)(.)/21/ file1 表示将合营到的率先部分和第二有个别轮换

*贪心选项:填上g,代表把大器晚成行中颇负相称项替换

3、awk 文本深入分析工具

由命令、正则(要求用//包围起来卡塔尔国、相比和关联运算组合而成

应用option中的-F参数定义间距符号

用$1,$2,$3等的逐一表示files中每行以间距符号分隔的各列不一致域,NF变量表示如今记下的字段数

语法

awk -选项 参数  '逻辑判定{命令 变量1,变量2,变量3}' 文件名

选项

-F 定义字段分隔符,私下认可的相间符是三番五次的空格或制表符
-v 定义变量并赋值 也足以借用次艺术从shell变量中引进

AWK变量

N奥迪Q5 当前记录的个数(全体文本延续后的总括)
FN冠道 当前记录的个数(仅为当下文件的计算,非全部)
FS 字段分隔符 默以为再三再四空格或制表符,能够动用多个区别的符号做分隔符 -F[:/]
OFS 输出字符的相间符 私下认可是空格
# awk -F: 'OFS="=====" {print $1,$2}' /etc/passwd
root=====x
NF 当前读入行的字段个数
O奇骏S 输出记录分隔符 私下认可是换行
# awk -F: 'ORS="=====" {print $1,$2}' /etc/passwd
root x=====bin x=====
FILENAME 当前文件名

【例1】使用AWK变量

# awk '{print NR,FNR,$1}' file1 file2 
1 1 aaaaa
2 2 bbbbb
3 3 ccccc
4 1 dddddd
5 2 eeeeee
6 3 ffffff
# 

【例2】援引shell变量的措施

# a=root
# awk -v var=$a -F: '$1 == var {print $0}' /etc/passwd
或者 把整个命令拆开传递,让shell变量外露,
# awk -F: '$1 == "'$a'" {print $0}' /etc/passwd
# a=NF
# awk -F: '{print $'$a'}' /etc/passwd

逻辑运算(可直接引用域举办演算卡塔 尔(阿拉伯语:قطر‎

= = -= /= *= 赋值

&& || ! 逻辑与 逻辑或 逻辑非

~ !~  相配正则或不宽容,正则必要用 /正则/ 包围住
< <= > >= != ==  关系 相比较字符串时要把字符串用双引号引起来

$ 字段援引:字段援用须要加$,而变量援引间接用变量名取

- * / % --  运算符

转义类别

\ 自身
$ 转义$
t 制表符
b 退格符
r 回车符
n 换行符
c 打消换行

如上所述是小编给大家介绍的正则表达式及Linux三大文本管理工科具,希望对我们全数助于,假使大家有任何疑问请给作者留言,笔者会及时恢复生机我们的。在这里也非常感激大家对帮客之家网站的支撑!

grep、sed和awk都以文本管理工科具,即使都以文本管理工科具但却都有独家的优缺点,...

正则表达式

正则表明式

POSIX标师长正则表明式分为两类
1.着力的正则表明式
2.扩大的正则表明式
绝大非常多Linux应用和工具仅扶助中央的正则表达式

二. grep及正则表明式

  1. grep
    • -n :显示行号
    • -o :只展现相配的内容
    • -q :静默格局,未有任何输出,得用$?来推断施行成功未有,即有未有过滤到想要的从头到尾的经过
    • -l :假若相配成功,则只将文件名打字与印刷出来,战败则不打印,平常-rl一起用,grep -rl 'root' /etc
    • -A :固然协作成功,则将相称行及然后n行一同打印出来
    • -B :假如合作成功,则将相配行及其前n行一同打字与印刷出来
    • -C :假如同盟成功,则将相称行及其左右n行一齐打字与印刷出来
    • -c :如若合营成功,则将相称到的行数打印出来
    • -E :等于egrep,扩展
    • -i :忽视大小写
    • -v :取反,不匹配
    • -w:相称单词
  2. 正则介绍
    • ^ :行首
    • $ :行尾
    • . :除了换行符以外的妄动单个字符
    • .*:全体字符
    • * :前导字符的零个或八个
    • :前导字符一个或三个
    • ? :前导字符零个或一个
    • x{m} :x出现m次
    • x{m,} :x现身m次至多次(最少m次)
    • x{m,n} :出现m次至n次
    • []:字符组内的任一字符
    • [^]:对字符组内的每种字符取反(不相配字符组内的各种字符)
    • ^[^]:非字符组内的字符伊始的行
    • -:只好放在最后
    • [a-z]:小写字母
    • [A-Z]:大写字母
    • [a-Z]澳门新浦京娱乐场网站:Linux文本处理命令,shell编程之正则表达式。:小写和大写字母
  3. 正则表明式与通配符
    • 通配符:与命令搭配使用
    • 正则表明式:日常用来文本管理

sort

sort 命令对 File 参数钦赐的公文中的行排序,并将结果写到标准输出。借使File 参数钦命多个文本,那么 sort 命令将这个文件连接起来,并作为三个文本进行排序。

正则表明式概述

l  正则表明式:使用单个字符串来描述,相称风流浪漫多元契合有个别句法则则的字符串

l  由平常字符与特殊字符组成

l  常常用在本子编制程序,文本编辑器中,如php、Python、shell等,简写为regex、regexp、RE

l  用来找寻、替换相符情势的文件,具备强有力的文书匹配功用

l  能够在文件海洋中异常快便捷地拍卖文件

l  正则表明式档次

底工正则表明式

进展正则表明式

l  Linux粤语本甩卖工具

grep

sed

awk

主题正则表明式

符号 意义
* 0个或多个字符
. 匹配任意字符
^ 行首,在[]中表示非
$ 行尾
[] 匹配字符集合
转义字符
<> 精确匹配符号
{n} 匹配n次
{n,} 匹配至少n次
{m,n} 匹配m~n次

三. Sed及正则表明式

  1. sed语法
    • sed [options] 'command' in_file[s]
      • options 部分
        • sed -n '动作' :静默
        • sed -e '动作' :四个准绳
        • sed -i '动作':直接校勘读取内容并写入
        • sed -f '动作' :将动作写在一个文件内;
      • command 部分
        • '[地址1,地址2] [函数] [参数(标记)]'
        • 定址的不二秘技 1.数字 2.正则
        • 函数
          • 增删改
          • a 后插
          • c 替换
          • i 前插
          • d 删除
          • 输入输出
          • p 打字与印刷相称的行 日常和 -n 参数连用,以遮挡私下认可输出
          • r 从文件中读入
          • w 写入到文件中
          • s 字符串替换 s/old/new/[g] (g表示生龙活虎行全体制改进动)
          • ():保存被相称的字符 以备反向援引N时使用 最多9个标签 标签顺序从左至右

sort语法

[root@www ~]# sort [-fbMnrtuk] [file or stdin]

选料与参数:
-f :忽视大小写的歧异,比方 A 与 a 视为编码相像;
-b :忽视最前头的空格符部分;
-M :以月份的名字来排序,比方 JAN, DEC 等等的排序方法;
-n :使用『纯数字』实行排序(暗许是以文字型态来排序的);
-r :反向排序;
-u :正是 uniq ,相似的数码中,仅现身大器晚成行代表;
-t :分隔符,私下认可是用 [tab] 键来分隔;
-k :以十三分区间 (田野(field)) 来拓宽排序的意趣

对/etc/passwd 的账号进行排序

[root@www ~]# cat /etc/passwd | sort
adm:x:3:4:adm:/var/adm:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

sort 是私下认可以率先个数据来排序,况且暗中同意是以字符串格局来排序,所以由字母 a 初阶升序排序。

/etc/passwd 内容是以 : 来分隔的,笔者想以第三栏来排序,该怎么

[root@www ~]# cat /etc/passwd | sort -t ':' -k 3
root:x:0:0:root:/root:/bin/bash
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin

暗中同意是以字符串来排序的,假设想要使用数字排序:

cat /etc/passwd | sort -t ':' -k 3n
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh

暗中同意是升序排序,就算要倒序排序,如下

cat /etc/passwd | sort -t ':' -k 3nr
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
ntp:x:106:113::/home/ntp:/bin/false
messagebus:x:105:109::/var/run/dbus:/bin/false
sshd:x:104:65534::/var/run/sshd:/usr/sbin/nologin

假若要对/etc/passwd,先以第七个域的第二个字符到第3个字符进行正向排序,再依据第三个域进行反向排序。

cat /etc/passwd |  sort -t':' -k 6.2,6.4 -k 1r      
sync:x:4:65534:sync:/bin:/bin/sync
proxy:x:13:13:proxy:/bin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh

查看/etc/passwd有稍许个shell:对/etc/passwd的第多少个域实行排序,然后去重:

cat /etc/passwd |  sort -t':' -k 7 -u
root:x:0:0:root:/root:/bin/bash
syslog:x:101:102::/home/syslog:/bin/false
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
sshd:x:104:65534::/var/run/sshd:/usr/sbin/nologin

正则表明式元字符

l  底子正则表明式是常用的正则表明式部分

l  除了平时字符外,常来看以下元字符

:转义字符,使符号正是标记,不设有别的意思。!,n等

^:相称字符串起始的岗位

       例:^a, ^the, ^#

$:相配字符串停止之处

       例:word$

.:匹配除n之外的轻便的一个字符

       例:go.d , g..d

*:相配后面子表明式0次依旧每每

       例:goo*d,go*d

[list]:相配list列表中的几个字符

       例:go[ola]d , [abc], [a-z], [a-z0-9]

[^list]:相配大肆不在list列表中的三个字符

       例:[^a-z], [^0-9], [^A-Z0-9]

{n,m}:相配后边的子表达式n到m次,有{n}, {n,}, {n,m}两种格式

       例:go{2}d, go{2,3}d, go{2,}

闻一知十正则表明式

符号 意义
? 匹配0个或1个
匹配1个或多个
() 表示一个字符集合或用在expr中
| 表示或

四.awk及正则表明式

  1. awk语法:awk [options] 'commands' files
    • -F 定义字段分隔符,私下认可的相间符是三回九转的空格或制表符,使用option中的-F参数定义间距符号
    • 用$1,$2,$3等的顺序表示files中每行以间距符号分隔的各列不一致域
    • NF变量表示近来记录的字段数
    • N索罗德 表示AWK读入的行数
    • 行处理:定址 命令
      • 定址方法: 正则,变量,比较和涉及运算
      • ~ !~:相配正则或不协作,正则须求用 /正则/ 包围住
    • -v 定义变量并赋值 也足以借用次艺术从shell变量中引进
      • username=root
      • awk -v var=$username -F: '$1 == var{print $1,NR,NF}' /etc/passwd

uniq

uniq命令能够去除排序过的公文中的重复行,由此uniq平时和sort合用。也正是说,为了使uniq起效用,全体的重复行必需是周围的。

恢宏正则说明式元字符

l  扩张正则表达式是对根底正则说明式的强盛抓实

l  扩张元字符

:相称前面子表明式1次之上

       例:go d, 将协作最少二个o

?:相称前面子表明式0次照旧1次

       例:go?d, 将匹配gd或者god

():将括号中的字符串作为三个总体

       例:(xyz) , 将匹配xyz整体1次以上,如xyzxyz

|:以或的章程相称字条串

       例1:good|food,将匹配good或者food

       例2:g(oo|la)d,将匹配good或者glad

 

通配符

bash Shell本人不协助正则表达式,使用正则表达式的是shell命令和工具,如grep,AWK,sed等。不过bash Shell可以选取正则表明式中的一些元字符完毕通配。

符号 意义 示例 解释
* 任意字符 Phi*ip.rtf 以Phi开头,以ip.rtf结尾的文件
? 一个任意字符 ls -l 0?.pem 列出0开头且文件为两个字符的pem文件
[] 表示范围 ls -l [a-h].awk 列出以a-h开头的awk文件
{} 一组表达式的组合 ls -l {[a-h]*.awk,0?.pem} 匹配[a-h]*.awk或0?.pem的文件
^ 取反 ls -l [a-h]*.[^awk]* 以a-h开头,且不是awk类型的文件

五. 别的命令

  1. cat 文件 | sort | uniq:文件排序去重
  2. cut -d分隔符 -fm,n:管理文件以分隔符切割取第m n部分
  3. du -sh:总括文件大小
  4. find 路线 -type f:根据项目查找普通文书
  5. find 路线 -name 文件名 :依照名字查找文件
  6. find 路线 -size 30M:寻觅抢先30M文书
  7. find 路线 -size 10M -size -30M:找寻当先10M低于30M的文本
  8. find / -size 2M -type f -name *.txt

uniq语法

[root@www ~]# uniq [-icu]

筛选与参数:
-i :忽视大小写字符的不等;
-c :进行计数
-u :只浮现唯意气风发的行

testfile的剧情如下

cat testfile
hello
world
friend
hello
world
hello

直接删除未经排序的文书,将会发掘并未有其余行被去除

#uniq testfile  
hello
world
friend
hello
world
hello

排序文件,私下认可是去重

#cat testfile | sort |uniq
friend
hello
world

排序之后剔除了再度行,同一时间在行首职责输出该行重复的次数

#sort testfile | uniq -c
1 friend
3 hello
2 world

仅呈现存在双重的行,并在行首彰显该行重复的次数

#sort testfile | uniq -dc
3 hello
2 world

仅呈现不重复的行

sort testfile | uniq -u
friend  

Sed工具实践

Grep

全面寻找正则表明式并把行打字与印刷出来(Global search Regular Expression and Print out the line卡塔尔国
grep [选项][模式][文件…]

cut

cut命令能够从多个文书文件大概文本流中提取文本列。

sed工具概述

l  sed是文本管理工科具,读取文本内容,依据钦定的条件实行管理,如删减,替换,加多等

l  可在无交互作用的情况下促成格外复杂的文本管理操作

l  被广泛应用于shell脚本,以达成自动化管理任务

l  Sed注重孙铎则表达式

选项

选项 意义 整词
-c 只输出匹配行的数量 count
-i 搜索时忽略大小写 ignore
-h 查询多文件时不显示文件名  
-l 只列出符合匹配的文件名,而不列出具体的匹配行 list
-n 列出所有的匹配行,并显示行号 number
-s 不显示不存在或无匹配文本的错误信息  
-v 显示不包含匹配文本的所有行 reverse
-w 匹配整词 word
-x 匹配整行  
-r 递归搜索,不仅搜索当前工作目录,而且搜索子目录 recursion
-q 禁止输出任何结果,以退出状态表示搜索是否成功 quit
-b 打印匹配行距文件头部的偏移量,以字节为单位 byte
-o 与-b选项结合使用,打印匹配的词距文件头部的偏移量,以字节为单位  
-E 支持扩展的正则表达式 Extract
-F 不支持正则表达式,按照字符串的字面意思进行匹配  

cut语法

[root@www ~]# cut -d'分隔字符' -f fields <==用于有特定分隔字符
[root@www ~]# cut -c 字符区间            <==用于排列整齐的信息

选料与参数:
-d :后边接分隔字符。与 -f 一同行使;
-f :依附 -d 的相间字符将生龙活虎段新闻分割成为数段,用 -f 收取第几段的情致;
-c :以字符 (characters) 的单位抽出固定字符区间;

PATH 变量如下

[root@www ~]# echo $PATH
/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games
# 1 | 2       | 3   | 4       | 5            | 6            | 7

将 PATH 变量抽取,小编要找寻第八个路子。

#echo $PATH | cut -d ':' -f 5
/usr/local/bin

将 PATH 变量抽取,作者要找寻第三和第七个门路。

#echo $PATH | cut -d ':' -f 3,5
/sbin:/usr/local/bin

将 PATH 变量抽出,我要寻觅第三到终极三个路径。

echo $PATH | cut -d ':' -f 3-
/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games

将 PATH 变量抽取,笔者要寻找第大器晚成到第七个门路。

#echo $PATH | cut -d ':' -f 1-3
/bin:/usr/bin:/sbin:

将 PATH 变量收取,小编要找寻第大器晚成到第三,还应该有第七个门路。

echo $PATH | cut -d ':' -f 1-3,5
/bin:/usr/bin:/sbin:/usr/local/bin

实用例子:只显示/etc/passwd的顾客和shell

#cat /etc/passwd | cut -d ':' -f 1,7 
root:/bin/bash
daemon:/bin/sh
bin:/bin/sh

Sed用法比方

l  替换譬如

sed ‘s/xml/XML/’ bfile  //将每行中的第三个xml替换为XML

sed ‘s/xml//g’ bfile  //将文件中装有xml删除

sed ‘3,5s/xml/XML/g’ bfile  //将第3-5行中的全部xml都替换为XML

sed ‘/xml/s/com/COM/g’ bfile  //将蕴涵xml的持有行中的com都替换为COM

l  很多次实践编辑命令

sed -e ‘3,5p’ -e ‘3,5s/xml/XML/g’ bfile  //可将多少个编辑命令保存到文件中,通过-f钦点文件,以产生两个管理操作

 

这只是sed和正则表明式的整合使用的一些案例

关于sed的实际选拔详见

模式

字符串、变量、正则表明式

专心:只要形式中包括空格,就必要运用双引号将形式引入来

wc

总括文件之中有个别许单词,多少行,多少字符。

awk工具施行

实例

-w和-x选项
grep命令模式扶植正则表达式,正则表达式的元字符被解释成非常意义;
-w选项表示相当整词,即以格局的字面意思去解释
如:
grep cer* *.pem
grep -w cer* *.pem
-x 是相称整行
-w 使用不便利,最佳和 -F 一同行使

wc语法

[root@www ~]# wc [-lwm]

慎选与参数:
-l :计算出游数
-w :计算出些许字(塞尔维亚语单词);
-m :总结字符数
-c :总括字节数
-L : --max-line-length 显示最长行的长度

暗中认可使用wc计算/etc/passwd

#wc /etc/passwd
40   45 1719 /etc/passwd
40是行数,45是单词数,1719是字节数

wc的命令比较轻巧使用,各样参数使用如下:

#wc -l /etc/passwd   #统计行数,在对记录数时,很常用
40 /etc/passwd       #表示系统有40个账户

#wc -w /etc/passwd  #统计单词出现次数
45 /etc/passwd

#wc -m /etc/passwd  #统计文件的字符数
1719

参考 :
Linux私房菜
Linux Shell常用技巧(生机勃勃)

awk工具介绍

l  awk也是几个功能强大的编写工具,与sed一样,可在无人驾驶飞机联作的动静下促成分外复杂的公文操作

l  命令格式

awk 选项 ‘格局或标准{编辑指令}’ 文件1 文本2

awk -f 脚本文件 文件1 文书2

l  职业原理

逐行读取文本,暗许以空格为分隔符举行分割,将分隔所得的顺序字段保存到内建变量中,并按方式可能规格试行编辑命令

l  awk 内置变量

FS:钦点每行文本的分隔符,缺省为空格或制表位

NF:当前管理的行的字段个数

NCRUISER:当前拍卖的行的行号(序数卡塔 尔(英语:State of Qatar)

$0:当前拍卖的行的整行内容

$n:当前管理行的第n个字段(第n列卡塔尔

grep命令族

grep
标准grep命令,支持核心正则表明式 egrep
扩张grep命令,帮忙大旨和强盛正则表明式
等价于grep -E fgrep
飞快grep命令,不扶持正则表明式,依据字面意思举行相称
等价于grep -F

SED

awk工具比如

l  打字与印刷文本内容

awk ‘NHighlander==1,NENVISION==3{print}’ bfile  //输出第一至第三行内容

awk ‘NWrangler==1|N传祺==3{print}’ bfile  //输出第生龙活虎行,第三行内容

awk ‘/^root/{print}’ /etc/passwd  //输出以root最早的行

 

l  按字段输出文本

awk ‘{print $1,$3}’ bfile  //输出每行中的第1,首个字段

awk -F “:” ‘{print$1,$7}’ /etc/shadow  //输出密码为空的顾客的shadow记录

 

同理awk的具体介绍详见

 

现今shell编制程序的基本知识都曾经领悟完结了,详见博主主页 http://www.cnblogs.com/tzlsj。shell编制程序源远流长,专长管理各类文件,与Linux的整整皆文件的性状十一分切合。

现行反革命询问的shell知识点有如四则运算法规,看似非常粗大略,实则种种组合生成。接下来小编会给我们找一些有意思的小本子,进行shell的实在应用和加强加强。

sed

sed,stream editor,流编辑器,将后生可畏种种编写制定命令成效于一堆文件文件
适用项合:

编排相对交互作用式编辑器来说太大的文书 编辑命令太复杂,在交互作用式文本编辑器中难以输入的图景 对文本扫描叁次,但是需求奉行多少个编辑函数的景况

二种调用格局

sed [选项] ‘sed命令’ 输入文件 sed [选项] -f sed脚本 输入文件 ./sed脚本文件 输入文件

Sed简介

  • sed 是黄金年代种在线编辑器,它二遍拍卖生机勃勃行内容。管理时,把近年来管理的行存储在不时缓冲区中,称为“情势空间”(pattern space卡塔 尔(阿拉伯语:قطر‎,接着用sed命令管理缓冲区中的内容,管理实现后,把缓冲区的内容送往显示器。接着管理下意气风发行,那样持续重复,直到文件末尾。文件内容并从未 更改,除非您使用重定向存款和储蓄输出。Sed重要用来自动编辑二个或八个公文;简化对文本的频仍操作;编写转变程序等。以下介绍的是Gnu版本的Sed 3.02。
  • sed全称是:Stream EDitor即流编辑器,是三个很好的文本管理工科具,自身是五个管道命令,处理时,把当下拍卖的行存款和储蓄在不时缓冲区中,接着用sed命令管理缓冲区中的内容,管理完了后,把缓冲区的源委送往荧屏。接着管理下生龙活虎行。它是以行为单位举办处理,能够将数据行进行替换、删除、新增添、采用等一定专门的学业。

选项

选项 意义
-n 不打印所有行到标准输出
-f 表示正在调用sed脚本文件
-e 表示将下一个字符串解析为sed编辑命令,如果只传递一个编辑命令给sed,可以省略-e

sed选项

  • -n :使用安静(silent)情势。在雷同 sed 的用法中,全体来自 STDIN 的数额貌似都会被列出到终端上。但万华为上 -n 参数后,则独有经过sed 特殊管理的那风流倜傥行(大概动作)才会被列出来。
  • -e :间接在命令列形式上开展 sed 的动作编排;
  • -i :直接改变读取的公文内容,并非出口到极限。

sed命令

不足为道由定点文本行和sed编辑命令两某个组成,sed编辑命令对一定文本行进行各类管理

sed function

  • a :新添, a 的前面能够接字串,而那个字串会在新的一整套取现金身(近日的下少年老成行)
  • d :删除,因为是删除啊,所以 d 后边平时不接任何内容
  • i :插入, i 的前边能够接字串,而这几个字串会在新的生机勃勃行现身(近年来的上生机勃勃行)
  • p :列印,亦就要某些选项的数码印出。平日 p 会与参数 sed -n 一齐运行
  • s :代替,能够一向开展替代的专门的职业!平日那些 s 的动作能够搭配正规表示法!举个例子 1,20s/old/new/g

sed定位文本行

选项 意义
x x为指定行
x,y 指定行范围
/pattern/ 包含模式的行
/pattern/pattern/ 包含两个模式的行
/pattern/,x 从与pattern的匹配行到x之间的行
x,/pattern/ 从x开始到pattern的匹配行
x,y! 不包括x和y的行

定址

能够因此定址来牢固你所期望编辑的行,该地方用数字组成,用逗号分隔的多个行数表示以这两行为起止的行的范围(包罗行数表示的这两行卡塔 尔(阿拉伯语:قطر‎。如1,3意味1,2,3行,英镑符号($)表示最后朝气蓬勃行。范围能够经过数量,正则表明式恐怕双方结合的方法确定。

sed编辑命令

sed编辑命令标示对文件进行何种处理,如打字与印刷,删除,追加,插入,替换等

选项 意义
p 打印匹配行
= 打印文件行号
d 删除定位行
a 在定位行号之后追加文本
i 在定位行号之前插入文本
c 用新文本替换定位文本行
s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 将文本写入另一个文本
y 变换字符
q 第一个模式匹配完成后退出
l 显示与八进制ASCII码等价的控制字符
{} 在定位行执行的命令组
n 读取下一个输入行,用下一个命令处理新的行
h 将模式缓冲区的文本复制到保持缓冲区
H 将模式缓冲区的文本追加到保持缓冲区
x 交换模式缓冲区和保持缓冲区
g 将保持缓冲区文本复制到模式缓冲区
G 将保持缓冲区文本追加到模式缓冲区

Sed命令

调用sed命令有三种样式:

  • sed [options] 'command' file(s)
  • sed [options] -f scriptfile file(s)
#将 /etc/passwd 的内容列出并且列印行号,同时,请将第 2~5 行删除!注意一下,原本应该是要下达 sed -e 才对,没有 -e 也行!
nl /etc/passwd | sed '2,5d'

#要删除第 3 到最后一行
nl /etc/passwd | sed '3,$d' 

#在第二行后(亦即是加在第三行)加上itcast
nl /etc/passwd | sed '2a itcast'

#如果是在第二行前面
nl /etc/passwd | sed '2i itcast'

#仅列出 /etc/passwd 文件内的第 5-7 行
nl /etc/passwd | sed -n '5,7p'

#获取当前eth0网卡的IP地址
ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
ifconfig eth0 | grep 'inet addr' | cut -d : -f2 | cut -d ' '  -f1
#练习
cat /etc/passwd > passwd.bak
#在第2行后面插入itcast字符
sed -i '3a itcast' passwd.bak

#删除文件中的第2行到第5行
sed -i '2,5d' passwd.bak

#使用来进行转义或使用#
sed -i 's//bin/bash//itcast/g' passwd.bak
sed -i 's#/bin/bash#/itcast#g' passwd.bak

#删除一个文件已#开头的行和空行
sed -i -e '/^#/d' -e '/^$/d' abc.txt

a
在近来进后面出席黄金时代行文本。
b lable
支行到脚本中包蕴标识的地点,若是分段不设有则分支到剧本的最后。
c
用新的文件更改行当的文件。
d
从沙盘块(Pattern space卡塔尔国地点删除行。
D
删去模板块的率先行。
i
在现阶段行方面插入文本。
h
拷贝模板块的内容到内部存款和储蓄器中的缓冲区。
H
充实模板块的内容到内存中的缓冲区
g
得到内部存款和储蓄器缓冲区的内容,并替代当前模板块中的文本。
G
获取内部存款和储蓄器缓冲区的剧情,并追加到眼前模板块文本的前边。
l
列表无法打字与印刷字符的清单。
n
读取下叁个输入行,用下一个指令管理新的行并非用第叁个指令。
N
日增下二个输入行到模板块前面并在两方间嵌入一个新行,改动近年来进号码。
p
打字与印刷模板块的行。
P(大写)
打字与印刷模板块的率先行。
q
退出Sed。
r file
从file中读行。
t label
if分支,从最后风流洒脱行初阶,条件黄金时代旦满意只怕T,t命令,将产生分支到含有标号的授命处,恐怕到剧本的最终。
T label
荒唐分支,从最终风流倜傥行最早,黄金年代旦产生错误大概T,t命令,将促成分支到含有标号的授命处,或然到剧本的尾声。
w file
写并扩张模板块到file末尾。
W file
写并追加模板块的第意气风发行到file末尾。
!
意味着后边的下令对全体未有被选定的行发生作用。
s/re/string
用string替换正则表达式re。
=
打字与印刷当前进号码。
#
把注释增到下三个换行符之前。
以下的是替换标志

  • g表示行内康健替换。
  • p表示打字与印刷行。
  • w表示把行写入四个文本。
  • x表示交换模板块中的文本和缓冲区中的文本。
  • y表示把二个字符翻译为其它的字符(但是不用彭三源则表明式卡塔 尔(阿拉伯语:قطر‎

实例

sed -n ‘1p’ file sed -e ‘/^f*/p’ -e ‘/^f*/=’ file 定位命令
相称元字符
sed -n ‘/./p’ input
sed -n ‘/$/p’ input 使用元字符进行相配
sed -n ‘p′input(注意:在sed命令中代表最终大器晚成行卡塔尔国
sed -n ‘/^$/p’ input (相称空行卡塔 尔(阿拉伯语:قطر‎
sed -n ‘/.*bus/p’ input !符号
sed -n ‘2,10!p’ input 使用行号与主要字相称约束行范围
sed -n ‘/seugrid/,$p’ input
sed -n ‘3,/seugrid/p’ input

编纂命令

插入文本
sed ‘钦赐地址itext’ input (在内定地点在此以前插入卡塔尔
sed ‘钦赐地址atext’ input (在钦赐地方然后插入卡塔尔
sed ‘/i/iinputnsecond’ (插入两行input和second卡塔 尔(英语:State of Qatar)
sed ‘/i/ainputnsecond’ 校订文件
sed ‘钦点地址ctext’ input (将全方位相称行校勘为新文本行卡塔尔
sed ‘/Certificate/cNew line:’ input 删除文本
sed ‘钦命地方d’ input (删除钦点行卡塔尔国 替换文本
sed ‘s/被替换字符串/新字符串/[轮换选项]’
sed ‘s/被替换字符串/新字符串/number[改变选项]’(表示第number(1~512)次匹配)

选项 意义
g 全部替换
p 与-n选项结合,只打印替换行
w 文件名 表示将输出定向到一个文件

写入新文件
sed ‘钦定地点w file’ input
sed ‘1,5w file’ input
sed ‘/Certificate/w file’ input 从文件读入文本
sed ‘钦点地址r file’ input 退出命令
sed ‘内定地址q’ input 转换命令
sed ‘y/被替换字符体系/调换的字符连串/’ 输入文件
八个系列长度必得生龙活虎致
sed ‘y/fmg/FMG/’ input 展现调节字符
突显退格符,F1键,shift键等
sed -n l input
sed -n ‘钦赐地方l’ input 在平昔行实行命令组
sed -n -e ‘/Certificate/p’ -e ‘/Certificate/=’ input
sed -n ‘/Certificate/{p;=}’ input 高端编辑命令
拍卖相配行的下大器晚成行
sed ‘/Certificate/{n;s/11/99/;}’ input sed缓冲区的拍卖
sed ‘/Subject/h;/seugrid/x;$G’ input
1.相配Subject,并将相配行写入保持缓冲区
2.匹配seugrid,将保证缓冲区和格局缓冲区交流
3.到结尾行,将保险缓冲区追加到情势缓冲区 利用分号分隔多少个编辑命令
上例已经运用了这种代表

选项

-e command, --expression=command
允超多台编辑。
-h, --help
打字与印刷支持,并展现bug列表的地点。
-n, --quiet, --silent
撤销暗许输出。
-f, --filer=script-file
易地而处sed脚本文件名。
-V, --version
打字与印刷版本和版权音讯。

AWK

awk的中央语法与C语言相似,与sed的成效形似,用来拍卖文件,awk能够从文件或字符串中基于钦命法规浏览和抽取消息,在抽出消息的底子上,能力拓宽此外文件操作
新式的awk是gawk,能够达成数量检索,收取文件中多少,创建管道流命令

元字符集

^
锚定行的带头 如:/^sed/相配全体以sed开端的行。
$
锚定行的实现 如:/sed$/相称全体以sed结尾的行。
.
杰出三个非换行符的字符 如:/s.d/相称s后接四个无节制字符,然后是d。
*
相配零或五个字符 如:/sed/相称全体模板是八个或多个空格后紧跟sed的行。
[]
相配一个点名范围内的字符,如/[Ss]ed/匹配sed和Sed。
[^]
匹配二个不在钦点范围内的字符,如:/[^A-RT-Z]ed/相配不分包A-RAV4和T-Z的叁个假名开端,紧跟ed的行。
(..)
封存相称的字符,如s/(love)able/1rs,loveable被替换来lovers。
&
保存寻觅字符用来替换别的字符,如s/love/&/,love这成love
*。
<
锚定单词的开首,如:/<love/相称包含以love开始的单词的行。
>
锚定单词的了断,如/love>/相称饱含以love结尾的单词的行。
x{m}
重复字符x,m次,如:/o{5}/相称包涵5个o的行。
x{m,}
再次字符x,起码m次,如:/o{5,}/相称至少有5个o的行。
x{m,n}
再也字符x,最少m次,非常少于n次,如:/o{5,10}/相配5--11个o的行。

AWK编制程序模型

awk程序由一个主输入循环维持,主输入循环自动依次读取文件行,用程序员定义的拍卖文件行的动作管理,循环试行直到终止条件。
与C,C ,Java的两样是,程序猿无需关爱张开文件,读取文件行,关闭文件的动作,而只关注管理行的进行动作。

澳门新浦京娱乐场网站 2

实例

AWK调用

Shell中调用
awk [-F 域分隔符] ‘awk程序段’ 输入文件 将awk程序段插入脚本文件
awk -f awk脚本文件 输入文件 将脚本文件设置为可实行
./awk脚本文件 输入文件

删除:d命令

  • $ sed '2d' example
    -----删除example文件的第二行。
  • $ sed '2,$d' example
    -----删除example文件的第二行到结尾全体行。
  • $ sed '$d' example
    -----删除example文件的末段黄金年代行。
  • $ sed '/test/'d example
    -----删除example文件全部包涵test的行。
  • $ sed -i '2d' example
    ----删除example文件第二行,并将去除后的结果写入(覆盖写入)example文件

AWK编程

替换:s命令

  • $ sed 's/test/mytest/g' example
    -----在整行范围内把test替换为mytest。若无g标志,则只有每行第1个门道非常的test被替换到mytest。
  • $ sed -n 's/^test/mytest/p' example
    -----(-n)选项和p标记一同利用表示只打字与印刷那多少个产生替换的行。也正是说,如若某风流倜傥行最早的test被替换来mytest,就打字与印刷它。
  • $ sed 's/^192.168.0.1/&localhost/' example
    -----&符号表示替换换字符串中被找到的部份。全数以192.168.0.1方始的行都会被替换成它自已加 localhost,形成192.168.0.1localhost。
  • $ sed -n 's/(love)able/1rs/p' example
    -----love被标识为1,全体loveable会被替换来lovers,并且替换的行会被打字与印刷出来。
  • $ sed 's#10#100#g' example
    -----无论什么字符,紧跟着s命令的都被以为是新的分隔符,所以,“#”在此处是分隔符,代替了暗中认可的“/”分隔符。表示把全部10替换来100。
    选定行的范围:逗号
  • $ sed -n '/test/,/check/p' example
    -----全体在模板test和check所分明的限量内的行都被打字与印刷。
  • $ sed -n '5,/^test/p' example
    -----打字与印刷从第五行最初到第二个包蕴以test最早的行之间的具有行。
  • $ sed '/test/,/check/s/$/sed test/' example-----对于模板test和west之间的行,每行的尾声用字符串sed test替换。
[root@hadoop shell]# cat testfile 
hello
friend
hello
world
hello
nihao
hahaha
hehehe
everybody
goodbye

[root@hadoop shell]# sed -n 's/^hello/&my/p' testfile 
hellomy
hellomy
hellomy

[root@hadoop shell]# sed 's/ha(ha)ha/**1**/p' testfile   
hello
friend
hello
world
hello
nihao
**ha**
**ha**
hehehe
everybody
goodbye

[root@hadoop shell]# sed 's/(ha)ha(ha)/1**2/p' testfile 
hello
friend
hello
world
hello
nihao
ha**ha
ha**ha
hehehe
everybody
goodbye

AWK形式相配

awk由格局和动作结合。情势是黄金时代组用于测验输入行是否需求实施语句,动作则是包括语句,函数和表明式的实践进度。即形式决定动作哪天触发事件,动作实施对输入行管理
如:awk ‘/^$/{print “this is a blank line.”}’ input

多点编辑:e命令

  • $ sed -e '1,5d' -e 's/test/check/' example
    -----(-e)选项允许在同意气风发行里进行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。命令的推行顺序对结果有震慑。如若五个指令都以替换命令,那么首先个替换命令将影响第四个替换命令的结果。
  • $ sed --expression='s/test/check/' --expression='/love/d' example
    -----三个比-e越来越好的通令是--expression。它能给sed表达式赋值。

记录和域

awk认为文件是有组织的,每大器晚成行为三个笔录,记录由域组成,域之间接受空格,Tab或任何标记实行分隔。
域操作符$:钦命试行动作的域,$1…标志每多少个域,$0代表整个记录;也足以跟变量或变量表明式
如:awk ‘BEGIN{one=1;two=2} {print $(one two)}’ input
暗许是空格,Tab键被认为是四个空格(也四个空格被当成一个空格卡塔 尔(英语:State of Qatar)
1.能够使用-F 来改造暗中同意的相间符
2.方可接纳条件变量FS设置分隔符
实例:
1.FS=”t”
2.FS=”t ”
记录:wazttcq
对于FS=”t” 分成多个域,waz,空域,cq;对于FS=”t ”,结果是waz,cq

从文件读入:r命令

  • $ sed '/test/r file' example
    -----file里的从头到尾的经过被读进去,展现在与test相配的行后边,假如合营多行,则file的剧情将显得在装有相称行的下面。

关联和布尔运算符

运算符 意义
<  
>  
~ 匹配正则表达式
!~ 不匹配正则表达式
ll  
&&  
!  

写入文件:w命令

  • $ sed -n '/test/w file' example
    -----在example中负有包蕴test的行都被写入file里。
实例:测试~运算符

awk ‘BEGIN{FS=”:”} $1~/root/’ input awk 条件语句
与C类似,有if,if/else,if/else if/else
awk ‘BEGIM{FS=”:”}{if(1 /root/)print0}’ passwd

追加命令:a命令

  • $ sed '/^test/a\--->this is a example' example '
    ----->this is a example'被追加到以test早先的行前边,sed供给命令a前面有一个反斜杠。

表达式

支持加( ),减(-),乘(*),除(/),模(%),乘方(^或**),自增( x,x )
叁个表达式可由数值,字符常量,变量,操作符,函数和正则表明式

插入:i命令

$ sed '/test/i\
new line
-------------------------' example

设若test被相配,则把反斜杠前面包车型大巴文本插入到相配行的前边。

实例

1.总计空白行数
awk ‘/^$/{x =1}END{print x}’ input
2.计量平均战表
awk ‘BEGIN{FS=”,”}{total=4 5 6 7;avg=total/4;print $1,avg}’ input

下一个:n命令

  • $ sed '/test/{ n; s/aa/bb/; }' example-----若是test被匹配,则运动到相称行的下后生可畏行,替换那风度翩翩行的aa,变为bb,并打字与印刷该行,然后继续。
    变形:y命令
  • $ sed '1,10y/abcde/ABCDE/' example-----把1--10行内全体abcde转换为大写,注意,正则表明式元字符无法利用那几个命令。

系统变量

变量 意义
$n 当前记录的第n个域,域间由FS分隔
$0 记录的所有域
FS 字段分隔符,默认空格
RS 记录分隔符,默认换行
NR 当前记录数
NF 当前记录中的域数量
OFS 输出域分隔符,默认空格
ORS 输出记录分隔符,默认换行
FILENAME 当前文件名
ARCC 命令行参数的数量
ARGIND 命令行中当前文件的位置(从0开始标号)
ARGV 命令行参数数组
CONVEMT 数字转换格式
ENVIRON 环境变量关联数组
ERRNO 最后一个系统错误的描述
FILEDWIDTHS 字段宽度列表,以空格键分隔
FIR 浏览文件的记录数
IGNORECASE 布尔变量,如果为真,则进行忽略大小写的匹配
OFMT 数字的输出格式
RLENGTH 由match函数匹配的字符串长度
RSTART 由match函数所匹配的字符串的第一个位置
SUBSEP 数组下标分隔符,默认值是34

退出:q命令

  • $ sed '10q' example-----打字与印刷完第10行后,退出sed。
    保证和拿到:h命令和G命令
  • $ sed -e '/test/h' -e '$G example-----在sed管理公事的时候,每后生可畏行都被保存在三个叫格局空间的暂且缓冲区中,除非洲开发银行被删去恐怕输出被打消,不然全部被拍卖的行都将 打字与印刷在显示屏上。接着格局空间被清空,并存入新的豆蔻梢头行等待管理。在此个例子里,相配test的行被找到后,将存入形式空间,h命令将其复制并存入贰个名字为保 持缓存区的非凡缓冲区内。第二条语句的意趣是,当到达最后少年老成行后,G命令收取保持缓冲区的行,然后把它放回格局空间中,且追加到前几天早已存在于方式空间中 的行的结尾。在这里个例子中就是增至终很大器晚成行。简单的话,任何带有test的行都被复制并追加到该公文的最后。
    维持和交流:h命令和x命令
  • $ sed -e '/test/h' -e '/check/x' example -----交换格局空间和保全缓冲区的开始和结果。也便是把带有test与check的行沟通。

格式化输出

awk的一大功用是发生报表,报表就需求遵照预订的格式化输出
printf(格式调节符,参数)

修饰符 意义
- 左对齐
width 域的步长
.prec 小数点右边的位数
0 1 2 3 4 5 6 7
格式符 %c %d %e %f %o %x %s

脚本

Sed脚本是三个sed的吩咐清单,运行Sed时以-f选项指引脚本文件名。Sed对于脚本中输入的下令极度训斥,在命令的尾声无法有任何空白或文本,如若在风流罗曼蒂克行中有四个指令,要用分号分隔。以#最早的表现注释行,且不能够跨行。

置于字符串函数

函数名 意义
gsub(r,s) 在输入文件中用s替换r,作用域为$0
gsub(r,s,t) 在t中用s替换r,可以作用于某个域$n
index(s,t) 返回s中字符串第一个t的位置
length(s) 返回s的长度
match(s,t) 测试s是否包含匹配t的字符串
split(r,s,t) 用t分隔r,生成数组s,生成数组的元素个数
sub(r,s,t) 将t中第一次出现的r替换为s
substr(r,s) 返回字符串r中从s开始的后缀部分
substr(r,s,t) 返回字符串r中从s开始长度为t的后缀部分

AWK

实例

awk ‘BEGIN{FS=”:”;OFS=”:”} gsub(/root/,”gridsphere”,$1)’ input awk ‘BEGIN{FS=”:”;OFS=”:”} gsub(/root/,”gridsphere”){print $0}’ input awk ‘BEGIN{print index(“gridsphere”,”ph”)}’ awk ‘BEGIN{print length(“gridsphere”)}’ awk ‘BEGIN{print match(“hello”,/h.*/)}’

简介

  • AWK是风姿洒脱种非凡的文本管理工科具。其名称得自于它的元老 AyrFred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的第3个假名,AWK 提供了头一无二强盛的功能:可以展开体制装入、流调节、数学运算符、进度调整语句以至于内置的变量和函数。它具有了三个意气风发体化的言语所应具有的差非常的少具有杰出天性。实际上 AWK 的确有着本身的言语:AWK 程序设计语言, 多少人创小编已将它正式定义为“样式扫描和处理语言”。它同意你创造简短的次序,这么些程序读取输入文件、为多少排序、处理多少、对输入施行计算以至变化报表,还会有众多其余的作用。
  • awk是三个有力的公文深入分析工具,相对于grep的物色,sed的编辑撰写,awk在其对数码剖析并扭转报告时,显得更为强盛。轻便的话awk正是把文件逐行的读入,以空格为暗中认可分隔符将每行切成条,切开的一些再实行各个解析管理。
  • awk有3个例外版本:awknawkgawk,未作非常说明,平日指gawk,gawk 是 AWK 的 GNU 版本。
  • awk其名目得自于它的开创者 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的第四个假名。实际上 AWK 的确具有谐和的语言: AWK 程序设计语言 , 四个人创小编已将它正式定义为“样式扫描和拍卖语言”。它同意你创立简短的顺序,这么些程序读取输入文件、为多少排序、管理多少、对输入实施总计以至改变报表,还大概有为数不菲其余的坚守。

向awk脚本传递参数

awk脚本内的变量能够在命令行中举办赋值,落成awk脚本传递参数,变量赋值放在脚本之后、输入文件早先,如
awk脚本 parameter=value 输入文件
awk传递的参数能够是自定义的,也得以是系统变量

利用方法

awk '{pattern action}' {filenames}

  • 就算操作大概会很复杂,但语法总是这么,在那之中 pattern 表示 AWK 在数额中寻觅的原委,而 action 是在找到相配内容时所施行的一文山会海命令。花括号({}卡塔尔国没有需求在先后中始终现身,但它们用于依据特定的方式对少年老成多级指令实行分组。 pattern正是要代表的正则表明式,用斜杠括起来。
  • awk语言的最基本作用是在文件可能字符串中基于内定准绳浏览和抽取音讯,awk抽出消息后,手艺实行此外文件操作。完整的awk脚本平常用来格式化文本文件中的新闻。
  • 常备,awk是以文件的黄金年代行为拍卖单位的。awk每接纳文件的风度翩翩行,然后实行相应的一声令下,来拍卖文件。

规范语句和循环语句

if() 动作1 [else 动作2]
while() 动作
do 动作 while()
for()动作

调用awk

有三种办法调用awk

  1. 命令行情势
    awk [-F field-separator] 'commands' input-file(s)
    其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待管理的公文。
    在awk中,文件的每生龙活虎行中,由域分隔符分开的每大器晚成项称为多个域。通常,在不点名-F域分隔符的气象下,默许的域分隔符是空格。
  2. shell脚本格局
    将兼具的awk命令插入叁个文书,并使awk程序可实践,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。
    约等于shell脚本首行的:#!/bin/sh
    可以换到:#!/bin/awk
  3. 将富有的awk命令插入叁个单独文件,然后调用:
    awk -f awk-script-file input-file(s)
    中间,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上边的是一致的。

本章注重介绍命令行格局。

数组

array[index]=value
1.涉嫌数组
关联数组是指数组的目录能够是字符串,也能够是数字
事关数组的值无须以一而再之处举办仓库储存。
awk的富有数组都以事关数组。使用的数字索引并不意味着数组存款和储蓄地点新闻
做客数组:
for(variable in array) do something with array[variable]
认清数组中是或不是存在某成分
if(index in array) do
2.split函数
split(r,s,t):以t为分隔符,将r字符串拆分为字符串数组,并寄存在s中
awk ‘BEGIN{print split(“abc/def/ghi”,str,”/”);for(i in str) print str[i]}’

AWK命令

  • awk命令格式

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

cat /etc/passwd | awk -F ':' '{print $0}'
awk -F ':' '{print $2}' /etc/passwd

awk -F ':' '1>0 {print $1} 2>1 {print $2}' /etc/passwd

awk 'BEGIN {print "this file is /etc/passwd"} {print $0}' /etc/passwd

awk -F ':' 'BEGIN {print "this file is /etc/passwd"} {print $1}' /etc/passwd

awk '{FS=":"} {print $1}' /etc/passwd
awk 'BEGIN {FS=":"} {print $1}' /etc/passwd

awk 'END {print "end of file"} {print $1}' /etc/passwd

ifconfig eth0 | grep 'inet addr' | awk -F ":" '{print $2}' | awk '{print $1}'

文本处理命令

文本管理命令包蕴对文本记录的排序、文件的合併和分隔等。具体命令:sort,uniq,join,cut,paste,split,tr,tar。那几个命令实现了对文件记录排序,总结,归并,提取,粘贴,分隔,过滤,压缩和平解决压等功效。与sed,awk构成了Linux文本管理的持有命令和工具

入门实例

  • 假设last -n 5的出口如下
[root@www ~]# last -n 5 <==仅取出前五行
root     pts/1   192.168.1.100  Tue Feb 10 11:21   still logged in
root     pts/1   192.168.1.100  Tue Feb 10 00:46 - 02:28  (01:41)
root     pts/1   192.168.1.100  Mon Feb  9 11:41 - 18:30  (06:48)
dmtsai   pts/1   192.168.1.100  Mon Feb  9 11:41 - 11:41  (00:00)
root     tty1                   Fri Sep  5 14:09 - 14:10  (00:01)
  • 设若只是呈现近来登入的5个帐号
#last -n 5 | awk  '{print $1}'
root
root
root
dmtsai
root

awk专门的学业流程是这么的:读入有'n'换行符分割的一条记下,然后将记录按钦赐的域分隔符划分域,填充域,$0则表示全数域,$1代表第两个域,$n代表第n个域。私下认可域分隔符是"空白键" 或 "[tab]键",所以$1表示登入顾客,$3代表登陆顾客ip,就那样类推。

  • 意气风发旦只是突显/etc/passwd的账户
#cat /etc/passwd |awk  -F ':'  '{print $1}'  
root
daemon
bin
sys

这种是awk action的示范,每行都会实行action{print $1}。
  -F钦命域分隔符为':'。

  • 若是只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割
#cat /etc/passwd |awk  -F ':'  '{print $1"t"$7}'
root    /bin/bash
daemon  /bin/sh
bin     /bin/sh
sys     /bin/sh
  • 即使只是呈现/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在颇负行增多列名name,shell,在结尾朝气蓬勃行增多"blue,/bin/nosh"。
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
....
blue,/bin/nosh

awk专门的学问流程是那般的:先实践BEGING,然后读取文件,读入有/n换行符分割的一条记下,然后将记录按钦赐的域分隔符划分域,填充域,$0则意味着全数域,$1表示第一个域,$n代表第n个域,随后开头进行情势所对应的动作action。接着初阶读入第二条记录······直到全部的记录都读完,最终施行END操作。

  • 搜索/etc/passwd有root关键字的具有行
#awk -F: '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash

这种是pattern的运用示例,相配了pattern(这里是root)的行才会推行action(未有钦命action,私下认可输出每行的内容)。
  寻找扶持正则,举例找root起头的: awk -F: '/^root/' /etc/passwd

  • 寻觅/etc/passwd有root关键字的兼具行,并展现相应的shell
# awk -F: '/root/{print $7}' /etc/passwd             
/bin/bash

那边钦命了action{print $7}

sort

rt:对文本举办排序。将输入文件作为由多条记下组成的数据流,而记录由可变宽度的字段组成。,以换行符作为定界符,sort命令与awk同样,可将记录分成多个域进行管理,暗许的域分隔符是空格符

sort [选项] [输入文件]

选项 意义
-c 测试文件是否已经被排序
-k 指定排序的域
-m 合并两个已排序的文件
-n 根据数字大小进行排序
-o[输出文件] 将输出写入到指定的文件,相当于将输出重定向到指定文件
-r 将排序结果逆向显示
-t 改变域分隔符
-u 去除结果中的重复行

sort -t: input sort -t: -k3 input sort -t: -k3n input
-n经常不独立使用,常常位于域号之后 sort -t: -k3nr input sort -t: -u input sort -t: -k3n -o output input sort -t: -c input sort -t: -m input1 input2
input1和input2必须有序

awk内置变量

awk有那多少个放松权利变量用来设置条件消息,那一个变量能够被改革,下边给出了最常用的有个别变量。

  • APAJEROGC 命令行参数个数
  • ARGV 命令行参数排列
  • ENVIRON 协理队列中系统蒙受变量的运用
  • FILENAME awk浏览的文书名
  • FN奇骏 浏览文件的记录数
  • FS 设置输入域分隔符,等价于命令行 -F选项
  • NF 浏览记录的域的个数
  • NEnclave 已读的记录数
  • OFS 输出域分隔符
  • O奥迪Q3S 输出记录分隔符
  • 大切诺基S 调整记录分隔符

其它,$0变量是指整条记录。$1代表近些日子行的第多少个域,$2表示如今进的第二个域,......就那样推算。

总计/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

运用printf替代print,能够让代码尤其简明,易读

 awk  -F ':'  '{printf("filename:%s,linenumber:%s,columns:%s,linecontent:%sn",FILENAME,NR,NF,$0)}' /etc/passwd

print和printf
awk中同不经常候提供了print和printf三种打字与印刷输出的函数。

其间print函数的参数能够是变量、数值大概字符串。字符串必得用双引号援引,参数用逗号分隔。若无逗号,参数就串联在一块儿而不可能区分。这里,逗号的坚守与出口文件的分隔符的效果是同等的,只是后面一个是空格而已。

printf函数,其用法和c语言中printf基本相同,能够格式化字符串,输出复杂时,printf更好用,代码更易懂。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

uniq

用于去除文本文件中的一连的双重行,雷同sort -u

选项 意义
-c 只打印每行在文本中重复出现的次数
-d 只显示有重复的记录,每个重复记录只出现一次
-u 只显示没有重复的记录

计算文件中的单词数
cat input | sed ‘s/./ /g;s/=/ /g;s/,/ /g;s/// /g;s/ /n/g;s/t/n/g’| sed ‘/^$/d’|sort| uniq -c | sort -nr

awk编程

  • 变量和赋值

除开awk的放到变量,awk仍然是能够自定义变量。
下边总结/etc/passwd的账户人数

awk '{count  ;print $0;} END{print "user count is ", count}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
......
user count is  40

count是自定义变量。早先的action{}里都是只有叁个print,其实print只是一个话语,而action{}能够有多少个语句,以;号隔开分离。

这里未有初步化count,即使暗中认可是0,不过得当的做法还是初始化为0:

awk 'BEGIN {count=0;print "[start]user count is ", count} {count=count 1;print $0;} END{print "[end]user count is ", count}' /etc/passwd
[start]user count is  0
root:x:0:0:root:/root:/bin/bash
...
[end]user count is  40

计算有些文件夹下的文件占用的字节数

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循环遍历数组

awk编制程序的内容极多,这里只位列轻巧常用的用法,更加多请参考

join

一而再再而三操作将多个公文中兼有相通域的记录选收取来,再将那一个记录全数的域放到生龙活虎行(富含来自八个公文的全部域卡塔 尔(阿拉伯语:قطر‎
留意:文件必需有序

选项 意义
-a1或-a2 除了显示以共同域进行连接的结果外,-a1表示还显示第一个文件中没有共同域的记录,-a2则表示显示第二个文件中没有共同域的记录
-i 比较域内容时,忽略大小写差异
-o 设置结果显示的格式
-t 改变域分隔符
-v1或-v2 与-a类似,但是,不显示以共同域进行连接的结果
-1和-2 -1用于设置文件1用于连接的域,-2用于设置文件2用于连接的域

join [选项] file1 file2
有点像sql中的join

join -t: teacher.db teacher_hobby.db
暗中认可第八个域相比,相等就总是。 -a有一点点像左外连接,右外连接
-a1 左连接 -a2右连接 -o表示展现那几个域(sql中的字段卡塔 尔(阿拉伯语:قطر‎
代表方法为 -o1.n 2.n -i忽视大小写 -t设置域分隔符 -v取反,即不展现合作域
用法与-a近似,-v1 -v2 -1,-2代表用来连接的域

实例

对此多少个域的连天,使用awk

awk ’
//(N奥迪Q5代表读取的记录数,FNSportage表示在那个时候此刻文件中的记录数,唯有首先个文件手艺使得N宝马X3==FNR)
NR==FNR
{
a[$1 FS $2]=$0;
//相当于break,本行管理终结,管理下大器晚成行
next;
}
//最后施行到此处时,a中蕴藏的是文件1中的记录
//当文件2的$1 FS $2在a中证实八个文本这两行同样
$1 FS$2 in a
{
//将点名列相等的笔录存款和储蓄在b中
b[FNR]=a[$1 FS $2] FS $3
}
END
{
//打印
//awk中的数组是关联数组
for(i=1;i<=FNR;i )
if(i in b)
print b[i]
}’
test1 test2

cut

cut命令用于从行业内部输入或文本文件中按域或按行提取文本

选项 意义
-c 指定提取的字符数或字符范围
-f 指定提取的域数或域范围
-d 改变域分隔符

-c按字符提取文本
cut -c2 input
cut -c1,5 input(提取第1个和第5个字符)
cut -c1-5 input(提取1~5那多少个字符卡塔尔国 -f按域提取文本 -d相仿sort和join中的-t

paste

用于将文件文件或正式输出中的内容粘贴到新的文书,它能够今后自不一致文件的数据粘贴到一齐,产生新的文件。假设五个文件的行数不一致,少的极度为空

paste [选项] 文件1 文件2…

选项 意义
-d 默认域分隔符是空格或Tab键,设置新的域分隔符
-s 将每个文件粘贴成一行
- 从标准输入中读取数据

split

用来将大文件切割成小文件,split命令能够遵守文件的行数,字节数切割文件,并能在出口的三个文本中自动抬高编号

split [选项] 待切割的大文件 输出的小文件

选项 意义
-n 用于指定切割成小文件的行数
-b 指定切割成小文件的字节
-C 与-b类似,但是,切割时尽量维持每行的完成性

split -2 input input(默认是x) split -b100 input input split -C100 input input

tr

现字符调换职能,tr能不负众望的sed都能不负职务,可是tr简单

tr [选项] 字符串1 字符串2 < 输入文件

选项 意义
-c 反选字符串1的字符集
-d 删除字符串1中出现的所有字符
-s 删除所有重复出现的字符序列,只保留一个

tar

归档命令,完毕了打包和平解决压文件

tar [选项] 文件名或目录名

选项 意义
-c 创建新的包
-x 解压文件
-t 列出包内容
-f 使用压缩文件或设备,该选项通常是必须的
-z 用gzip压缩和解压缩文件,若加上此选项创建压缩包,那么解压缩时也需要加上此选项
-j bz2
-v 查看过程
-r 向宝中添加文件

gzip 压缩文件

Linux文本管理总括

Linux文本处理命令 应用
grep 全面搜索正则表达式并把行打印出来,grep命令族:grep,egrep,fgrep
sed 流编辑,将一系列编辑命令作用于缓冲区中输入文件的副本,从而实现输入文件的各种编辑操作
awk 特点是处理结构化文件,所谓结构化,指划分为域和记录的文件
sort 对文本进行排序
uniq 去除文本的连续重复行,也可以统计重复行的数量
join 类似数据库中的连接操作
cut 从标准输入或输入文件中按行或按域提取文本
paste 用于将多个文件或标准输出中的内容粘贴而形成新的文件
split 用于将大文件切割成小文件
tr 实现字符替换功能,可以实现文本文件的过滤功能
tar 归档命令,和gzip用于实现Linux系统文件的压缩和解压

 

正则表明式 POSIX标少将正则表达式分为两类 1.骨干的正则表达式 2.恢宏的正则表明式 超过半数Linux应用和工具仅辅助主旨的...

本文由澳门新浦京娱乐场网站发布于澳门新浦京娱乐场网站,转载请注明出处:澳门新浦京娱乐场网站:Linux文本处理命令,sh