转自 awk技巧(如取某一行数据中的倒数第N列等) - 散尽浮华 - 博客园 https://www.cnblogs.com/kevingrace/p/8481965.html
使用awk取某一行数据中的倒数第N列:$(NF-(n-1))
比如取/etc/passwd文件中的第2列、倒数第1、倒数第2、倒数第4列(以冒号为分隔符)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
[root@ipsan-node06 ~]
# cat /etc/passwd
root:x:0:0:root:
/root
:
/bin/bash
bin:x:1:1:bin:
/bin
:
/sbin/nologin
daemon:x:2:2:daemon:
/sbin
:
/sbin/nologin
adm:x:3:4:adm:
/var/adm
:
/sbin/nologin
lp:x:4:7:lp:
/var/spool/lpd
:
/sbin/nologin
sync
:x:5:0:
sync
:
/sbin
:
/bin/sync
shutdown
:x:6:0:
shutdown
:
/sbin
:
/sbin/shutdown
halt:x:7:0:halt:
/sbin
:
/sbin/halt
mail:x:8:12:mail:
/var/spool/mail
:
/sbin/nologin
operator:x:11:0:operator:
/root
:
/sbin/nologin
[root@ipsan-node06 ~]
# awk -F":" '{print $2,$(NF),$(NF-1),$(NF-3)}' /etc/passwd
x
/bin/bash
/root
0
x
/sbin/nologin
/bin
1
x
/sbin/nologin
/sbin
2
x
/sbin/nologin
/var/adm
4
x
/sbin/nologin
/var/spool/lpd
7
x
/bin/sync
/sbin
0
x
/sbin/shutdown
/sbin
0
x
/sbin/halt
/sbin
0
x
/sbin/nologin
/var/spool/mail
12
x
/sbin/nologin
/root
0
|
linux实现将文本文件每一行中相同第一列对应的其他列进行拼接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
[root@jump-v4 ~]
# sort b.txt|uniq
1 34
1 49
2 45
2 48
3 54
3 57
3 89
[root@jump-v4 ~]
# sort b.txt|uniq|awk '{a[$1]=(a[$1]" "$2);} END{for(i in a) print i ":"a[i]}'
1: 34 49
2: 45 48
3: 54 57 89
命令解析:
1)首先
sort
test
|
uniq
实现对
test
文件的去重,去掉了重复的 1 49,保留不同的行;
2)
awk
'{a[$1]=(a[$1]" "$2);} END{for(i in a) print i ":"a[i]}'
表示的含义是: 将每一行的第一列最为数组a的key,
第二列作为a的value,同时碰到相同的key,就把其值进行拼接,linux的shell的字符串拼接形式为str = (str “ ” $var),
最后遍历数组a,其中i为数组a的每一个key,a[i]为key对应的值;
|
使用awk命令获取文本的某一行,某一列的技巧:
1
2
3
4
5
6
|
1)打印文件的第一列(域) :
awk
'{print $1}'
filename
2)打印文件的前两列(域) :
awk
'{print $1,$2}'
filename
3)打印完第一列,然后打印第二列 :
awk
'{print $1 $2}'
filename
4)打印文本文件的总行数 :
awk
'END{print NR}'
filename
5)打印文本第一行 :
awk
'NR==1{print}'
filename
6)打印文本第二行第一列 :
sed
-n
"2, 1p"
filename |
awk
'print $1'
|
Awk取文件中的指定数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
[root@jump-v4 ~]
# cat a.txt
123.122.123.12 12121212
121.2332.121.11 232323
255.255.255.255 21321
123.122.123.12 12121212
123.122.123.12 1212121er2
123.122.123.12 12121212eer
123.122.123.12 12121212ere
255.255.255.255 21321
121.2332.121.11 232323
255.255.255.255 21321
[root@jump-v4 ~]
# cat a.txt|awk '{print $1}'
123.122.123.12
121.2332.121.11
255.255.255.255
123.122.123.12
123.122.123.12
123.122.123.12
123.122.123.12
255.255.255.255
121.2332.121.11
255.255.255.255
[root@jump-v4 ~]
# cat a.txt|awk '{print $1}'|sort|uniq -c
2 121.2332.121.11
5 123.122.123.12
3 255.255.255.255
[root@jump-v4 ~]
# cat a.txt|awk '{print $1}'|sort|uniq -c|awk '{print $2,$1}'
121.2332.121.11 2
123.122.123.12 5
255.255.255.255 3
[root@jump-v4 ~]
# cat a.txt|awk '{print $1}'|sort|uniq -c|awk '{print $2,$1}'|sort -k2 -rn
123.122.123.12 5
255.255.255.255 3
121.2332.121.11 2
|
linux文件按大小来排序
1
2
3
4
5
6
|
[root@cdn ~]
# ls -s | sort -k 1 -n
表示对第一个字段(即文件大小)按数值大小进行排序;
如果想倒序,可以增加-r参数;
sort
命令可进行排序;
-k参数表示对第几个字段进行排序;
ls
-s:第一列显示的是文件大小
|
定时删除resin日志的脚本,每小时删除一次
1
2
3
4
5
6
|
[root@cdn ~]
# cat resin-log.sh
#!/bin/bash
cd
/data/log/resin
&&
find
/data/log/resin
\( -name
"*jvm-app-0.log.*"
-a ! -name
"*.gz"
\) -a -mmin +30 -
exec
gzip
{} \;
[root@cdn ~]
# crontab -l
0 * * * *
/bin/bash
-x
/root/resin-log
.sh >
/dev/null
2>&1
|