目标文件
[clooker ~]$ cat 123
aaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbb
ccccccccccccccccccccccc
ddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeee
fffffffffffffffffffffff
gggggggggggg ggggggggg
[clooker ~]$
1. 使用tr命令
tr的核心功能及时删除或者转换字符,详细说明如下:
NAME
tr - translate or delete characters
SYNOPSIS
tr [OPTION]... SET1 [SET2]
DESCRIPTION
Translate, squeeze, and/or delete characters from standard input, writing to standard output.
-c, -C, --complement
use the complement of SET1
-d, --delete
删除出现在SET1中的字符
-s, --squeeze-repeats
去掉连续出现字符中后续的重复字符,只留第一个。
-t, --truncate-set1
first truncate SET1 to length of SET2
所以,我们可以使用tr -s命令去掉重复出现的\n,达到删除空行的目的。如下:
[clooker ~]$ cat 123 |tr -s '\n'
aaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbb
ccccccccccccccccccccccc
ddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeee
fffffffffffffffffffffff
gggggggggggg ggggggggg
[clooker ~]$
补充
除了简单的去除空行,tr支持很多其他功能。下面列出的所有字符描述都可以作为替换或者删除的目标:
\NNN character with octal value NNN (1 to 3 octal digits)
\\ backslash
\a audible BEL
\b backspace
\f form feed
\n new line
\r return
\t horizontal tab
\v vertical tab
CHAR1-CHAR2
all characters from CHAR1 to CHAR2 in ascending order
[CHAR*]
in SET2, copies of CHAR until length of SET1
[CHAR*REPEAT]
REPEAT copies of CHAR, REPEAT octal if starting with 0
[:alnum:]
all letters and digits
[:alpha:]
all letters
[:blank:]
all horizontal whitespace
[:cntrl:]
all control characters
[:digit:]
all digits
[:graph:]
all printable characters, not including space
[:lower:]
all lower case letters
[:print:]
all printable characters, including space
[:punct:]
all punctuation characters
[:space:]
[:upper:]
all upper case letters
[:xdigit:]
all hexadecimal digits
[=CHAR=]
all characters which are equivalent to CHAR
例如我们想要删除所有字符a
[clooker ~]$ echo abcdabcd |tr -d 'a'
bcdbcd
[clooker ~]$
删除所有小写字符
[clooker ~]$ echo abcdabcdABCDa |tr -d [:lower:]
ABCD
[clooker ~]$
2. 使用sed命令
sed是常见的字符替换命令,标准格式是:
[clooker ~]$ echo 123456 |sed 's/3/c/g'
12c456
[clooker ~]$
去掉空行命令如下:
[clooker ~]$ cat 123 |sed '/^$/d'
aaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbb
ccccccccccccccccccccccc
ddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeee
fffffffffffffffffffffff
gggggggggggg ggggggggg
[clooker ~]$
d:删除匹配到的字符
//:可以放置正则表达式
^:行开始
KaTeX parse error: Expected group after '^' at position 19: …束
因此上述命令表示删除空行(^̲之间没有任何字符)。
3. 使用grep命令
原理同上。
[clooker ~]$ cat 123 |grep -v '^$'
aaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbb
ccccccccccccccccccccccc
ddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeee
fffffffffffffffffffffff
gggggggggggg ggggggggg
[clooker ~]$
-v:不包含
4. 使用awk命令
[clooker ~]$ cat 123 |awk '$0'
aaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbb
ccccccccccccccccccccccc
ddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeee
fffffffffffffffffffffff
gggggggggggg ggggggggg
[clooker ~]$
awk默认按照空格对每一行进行分割,然后通过$n输出想要的数据。
$0:所有字符
其实对一部分人来说,对上边那个命令还有些疑惑,下面详细了解下。
常见的awk使用方式是:
[clooker ~]$ cat 123 |awk '{print $1}'
aaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbb
ccccccccccccccccccccccc
ddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeee
fffffffffffffffffffffff
gggggggggggg
[clooker ~]$
我们把空格作为分隔符,对每一行数据进行分割,然后输出第一列。可以看到最后一行数据的第二列没有输出。
然后我们还可以加一些判断条件,只输出满足条件的数据:
[clooker ~]$ cat 123 |awk '{print length}'
23
0
23
0
23
0
23
23
0
0
23
0
23
[clooker ~]$
[clooker ~]$ cat 123 |awk '{if(length>1) print}'
aaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbb
ccccccccccccccccccccccc
ddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeee
fffffffffffffffffffffff
gggggggggggg ggggggggg
[clooker ~]$
其中length是awk命令中的内置变量,除了length还有NF(分割后的列数)等。
如果判断条件不负责,可以提到大括号之前的:
[clooker ~]$ cat 123 |awk 'length>1{print}'
aaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbb
ccccccccccccccccccccccc
ddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeee
fffffffffffffffffffffff
gggggggggggg ggggggggg
如果全部数据都需要输出,那么{}也是可以省略的:
[clooker ~]$ cat 123 |awk 'length>1'
aaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbb
ccccccccccccccccccccccc
ddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeee
fffffffffffffffffffffff
gggggggggggg ggggggggg
[clooker ~]$
由此我们可以知道,这个命令是先按照空格对每行进行分割,然后把满足条件的行输出出来。
$0表示一行中的全部字符,所以如果是空行,则$0就是false,所以就不会输出,所以实现删除空行的功能。
我们可以再验证下
最后一行分割后会有两列,前边的都是一列,我们可以把$0换成$2,从而只保留最后一列。
[clooker ~]$ cat 123 |awk '$2'
gggggggggggg ggggggggg
[clooker ~]$
结果符合我们的预期。
其他
Linux下的awk还有很多很强大的功能,例如对一行中的数据进行计算。
原始数据:
[clooker ~]$ cat nums
1 2 3
4 5 6
7 8 9
[clooker ~]$
每一行的第一列和最后一列相加,输出每一行的结果
[clooker ~]$ cat nums |awk '{sum=$1+$3}{print sum}'
4
10
16
[clooker ~]$
每一行的第一列相加,输出最终结果
[clooker ~]$ cat nums |awk '{sum+=$1}END{print sum}'
12
[clooker ~]$

1123

被折叠的 条评论
为什么被折叠?



