Linux Shell脚本攻略-文本处理命令

cat

用于读取、显示或拼接文件内容

打印单个文件的内容:

$ cat file.txt
This is a line inside file.txt
This is the second line inside file.txt

打印多个文件的内容:

$ cat one.txt two.txt
This is line from one.txt
This is line from two.txt

连接标准输入和文件:

$ echo 'Text through stdin' | cat - file.txt

去除连续的空白行:

cat -s file

显示行号:

cat -n lines.txt

head/tail

可以处理文件也可以处理标准输入

查看前x行,默认10行

head -n x fileName

查看除后x行的其他行

head -n -x fileName

查看后x行,默认10行

tail -n x fileName

查看除前x行的其他行

tail -n -(x+1) fileName

查询动态变动的文件

tail -f fileName或者tailf fileName

tr

转换( translate)命令。tr只能接受标准输入的内容进行字符替换、字符删除以及重复字符压缩。只能按字符匹配。

大写转小写

echo "HELLO WHO IS THIS" | tr 'A-Z' 'a-z'

删除字符

$ echo "Hello 123 world 456" | tr -d '0-9'
Hello world

用tr压缩字符

echo "GNU    is    not   UNIX.    Recursive     right ?" | tr -s ' '

sort/uniq

都可以接收标准输入和文件,uniq的内容必须是排序好的

单个文件排序

sort file1.txt

合并成排序好的

sort file1.txt file2.txt > sorted.txt

按照数字顺序排序

sort -n file.txt

按照逆序排序

sort -r file.txt

去除重复的行

sort file1.txt file2.txt | uniq

不输出,如果已是排序的$?返回0,否则非0

sort -C unsort.txt

按第几列排序,0开始

sort -k 3 a.txt

按哪段字符排序

sort -k 2,3 data.txt

只显示唯一的行

uniq -u sorted.txt

只显示重复的行

sort unsorted.txt | uniq -d

统计每行出现的次数

sort unsorted.txt | uniq -c

指定唯一键范围,忽略前2个字符(-s 2),长度(-w 2)

sort data.txt | uniq -s 2 -w 2

wc

可以接收标准输入和文件

  1. 统计行数:
$ wc -l file
  1. 统计单词数:
$ wc -w file
$ cat file | wc -w
  1. 统计字符数:
$ wc -c file
$ cat file | wc -c
  1. 使用-L选项打印出文件中最长一行的长度:
$ wc file -L
205

grep

可以接收文件和标准输入

同时查询多个文件

$ grep "match_text" file1 file2 file3 ...

用–color选项可以在输出行中着重标记出匹配到的单词:

$ grep word filename --color=auto

正则表达式匹配

$ grep -E "[a-z]+" filename
#或者
$ egrep "[a-z]+" filename

同时搜索多个条件

grep -E "ERROR|WARN" eos-api-wct.log

只输出文件中匹配到的文本部分,可以使用选项 -o:

$ echo this is a line. | egrep -o "[a-z]+\."
line.

统计文件或文本中包含匹配字符串的行数

$ grep -c "text" filename

要文件中统计匹配项的数量,可以使用下面的技巧:

$ echo -e "1 2 3 4\nhello\n5 6" | egrep -o "[0-9]" | wc -l

cut

cut是一个帮我们将文本按列进行切分的小巧工具,可以接收输入流和文件。分隔符只能一个字符。

剪切出2、3列出来,指定分隔符为空格

$ cut -f "2,3" -d " " filename

排除列,其他剪切出来

$ cut -f3 --complement student_data.txt
  • 连续范围列剪切
  • N- 从第N个字节,字符或字段到行尾
  • N-M 从第N个字节,字符或字段到第M个(包括第M个在内)字节、字符或字段
  • -M 第1个字节,字符或字段到第M个(包括第M个在内)字节、字符或字段
  • -b 表示字节;
  • -c 表示字符;
  • -f 用于定义字段。
    例如:
cut -c1-5 range_fields.txt

指定输出的分隔符

cut range_fields.txt -c1-3,6-9 --output-delimiter ","

sed

sed是流编辑器( stream editor)的缩写,可以接收标准输入和文件,擅长行的控制

只打印指定行

sed -n '3p' file #只打印第3行
sed -n '1,3p' file #打印区间1到3行

删除指定行

sed '2d' file #删除指定行
sed '2,5d' file #删除区间2到5行

移除空白行

$ sed '/^$/d' file

替换字符串

$ sed 's/pattern/replace_string/' file
#或者
$ cat file | sed 's/pattern/replace_string/'

$ sed -i 's/text/replace/' file #替换源文件
$ sed 's/pattern/replace_string/g' file #g意味着sed会替换每行的每一处匹配
$ echo thisthisthisthis | sed 's/this/THIS/2' #替换第几个this
$ sed 's/\b[0-9]\{3\}\b/NUMBER/g' file #正则表达式匹配替换

$ echo this is an example | sed 's/\w\+/[&]/g' #已匹配字符串标记( &)
[this] [is] [an] [example]

$ echo seven EIGHT | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/' #\\(pattern\\)用于匹配子串

组合多个表达式
可以利用管道组合多个sed命令:

sed 'expression' | sed 'expression'
#它等价于
$ sed 'expression; expression'
#或者
$ sed -e 'expression' -e 'expression'

awk

可以接收文件和标准输入

awk 'BEGIN{ print "start" } /pattern/ { commands } END{ print "end" }' file
  1. 执行BEGIN { commands } 语句块中的语句,“BEGIN”需大写
  2. 从文件或stdin中读取一行,然后执行pattern { commands }。重复这个过程,直到文件全部被读取完毕。
  3. 当读至输入流末尾时,执行END { commands } 语句块,“END”需大写
  4. 中间部分默认执行{ print }
  5. pattern用于过滤匹配哪些行,没有提供样式那么awk就认为所有的行都是匹配的
  6. 当print的参数是以逗号进行分隔时,参数打印时则以空格作为定界符
  • NR:表示记录数量,在执行过程中对应于当前行号。
  • NF:表示字段数量,在执行过程中对应于当前行的字段数。
  • $0:这个变量包含执行过程中当前行的文本内容。
  • $1:这个变量包含第一个字段的文本内容。
  • $2:这个变量包含第二个字段的文本内容

简单例子:

$ echo -e "line1\nline2" | awk 'BEGIN{ print "Start" } { print } END{ print "End" } '
Start
line1
line2
End

拼接的使用方法如下:

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

可以用print $NF打印一行中最后一个字段,用 $(NF-1)打印倒数第二个字段

打印每一行的第2和第3个字段:

$awk '{ print $3,$2 }' file

要统计文件中的行数:

$ awk 'END{ print NR }' file

将外部变量值传递给awk
借助选项 -v,我们可以将外部值(并非来自stdin)传递给awk:

$ VAR=10000
$ echo | awk -v VARIABLE=$VAR '{ print VARIABLE }'
10000

还有另一种灵活的方法可以将多个外部变量传递给awk,例如:

$ var1="Variable1" ; var2="Variable2"
$ echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2

使用过滤模式对awk处理的行进行过滤

$ awk 'NR < 5' # 行号小于5的行
$ awk 'NR==1,NR==4' # 行号在1到5之间的行
$ awk '/linux/' # 包含样式linux的行(可以用正则表达式来指定模式)
$ awk '!/linux/' # 不包含包含模式为linux的行

设置字段定界符

$ awk -F: '{ print $NF }' /etc/passwd
#或者
awk 'BEGIN { FS=":" } { print $NF }' /etc/passwd

从awk中读取命令输出

$ echo | awk '{ "grep root /etc/passwd" | getline cmdout ; print cmdout }'
root:x:0:0:root:/root:/bin/bash

在awk的“{}”中语法和C一样

for(i=0;i<10;i++) { print $i ; }
#或者
for(i in array) { print array[i]; }

awk内建的字符串控制函数

  • length(string):返回字符串的长度。
  • index(string, search_string):返回search_string在字符串中出现的位置。
  • split(string, array, delimiter):用定界符生成一个字符串列表,并将该列表存
    入数组。
  • substr(string, start-position, end-position):在字符串中用字符起止偏移
    量生成子串,并返回该子串。
  • sub(regex, replacement_str, string):将正则表达式匹配到的第一处内容替换
    成replacment_str。
  • gsub(regex, replacment_str, string):和sub()类似。不过该函数会替换正则表
    达式匹配到的所有内容。
  • match(regex, string):检查正则表达式是否能够匹配字符串。如果能够匹配,返回非0值;否则,返回0。
  • match()有两个相关的特殊变量,分别是RSTART和RLENGTH。变量RSTART包含正则表达式所匹配内容的起始位置,而变量RLENGTH包含正则表达式所匹配内容的长度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值