关闭

linux-常用命令

标签: linux
248人阅读 评论(0) 收藏 举报
分类:

awk

awk特殊变量


Awk特殊变量

描述

$number

表示记录的字段。比如,$1表示第1个字段,$2表示第2个字段,如此类推。而$0比较特殊,表示整个当前行

FS

表示字段分隔符    Filed Separator

NF

表示当前记录中的字段数量  Number Filed

NR

表示当前记录的编号(awk将第一个记录算作记录号1)   Number Record


Awk特殊变量

描述

RS

表示记录分隔符   Record Separator

OFS

表示输出字段分隔符,在两个单独的字段间插入定义的字符串 Output Filed Separator

ORS

表示输出记录分隔符,在两个单独的记录间插入定义的字符串 Output Record Separator


-v :定义变量 awk -v i=0
-F :定义字段分割符,同FS

测试文件,通讯录文件address,其内容如下:

zhangsan

13712345678

zhs@hotmail.com

 

lisi

13012345678

ls@21cn.com

要处理这个文件,可以将每三行看作是一个独立的记录,一个记录包含三个字段。如下脚本将原记录由三行转换成一行输出:

BEGIN {

    FS="\n"

    RS=""

}

 

{

    print $1 ", " $2 ", " $3

}

此代码将产生以下输出:

zhangsan, 13712345678, zhs@hotmail.com

lisi, 13012345678, ls@21cn.com

在上面例子中,为了在三个字段之间插入一个逗号和空格,使用了", "。这个方法虽然有用,但比较难看。其实我们还有更好的方法,那就是设置变量OFS(输出字段分隔符)。OFS缺省情况下被设置成" "(单个空格)。使用如下脚本可以达到上面例子同样的效果:

BEGIN {

    FS="\n"

    RS=""

    OFS=", "

}

 

{

    print $1, $2, $3

}

awk还有一个特殊变量ORS(输出记录分隔符)。ORS缺省情况下被设置成"\n",如果我们将其设为"\n\n",就可以使输出记录的间隔翻倍。

需要注意的是,使用上面的方法,最多只能处理一个记录占用三行的文本,象下面一个记录占据四行的通讯录,就处理不了了(大家可以试试看):

wangwu

13512345678

ww@163.com

wuhan, hubei

要处理这种情况,代码最好考虑每个记录的字段数量,并依次打印每个记录。以下就是修正的代码:

BEGIN {

    FS="\n"

    RS=""

    ORS=""

}

 

        x=1

        while ( x<NF ) {

                print $x "\t"

                x++

        }

        print $NF "\n"


条件控制语句


awkif语句类似于C语言的if语句,没什么好说的,举一个例子吧:

{

    if ( $1 == "foo" ) {

        if ( $2 == "foo" ) {

            print "uno"

        } else {

            print "one"

        }

    } else if ($1 == "bar" ) {

        print "two"

    } else {

        print "three"

    }

}

3.3   循环语句

其时在第1节的最后,我们已经看到了awkwhile循环结构,它等同于相应的C语言while循环。awk还有"do...while"循环,它在代码块结尾处对条件求值,还是直接举例吧:

do...while 示例

{

    count=1

    do {

        print "I get printed at least once no matter what"

    } while ( count != 1 )

}

for 循环

也等同于C语言的for循环:

for ( x = 1; x <= 4; x++ ) {

    print "iteration",x

}

break continue

此外,如同C语言一样,awk提供了breakcontinue来控制awk的循环结构。break语句用于跳出最深层的循环,使循环立即终止,并继续执行循环代码块后面的语句。continue语句使awk立即开始执行下一个循环迭代,而不执行代码块的其余部分。

3.4   数组

awk中,数组下标通常从1开始,而不是0

myarray[1]="jim"

myarray[2]=456

awk遇到第一个赋值语句时,它将创建myarray,并将元素myarray[1]设置成"jim"。执行了第二个赋值语句后,数组就有两个元素了。Awk数组不需要连续的数字序列下标(例如,可以定义myarr[1]myarr[1000],但不定义其它所有元素)

awk可以使用"in"操作来遍历数组中的所有元素,如下所示:

for ( x in myarray ) {

    print myarray[x]

}

但是这个方法有一个缺点——当awk在数组下标之间轮转时,它不会依照任何特定的顺序。那就意味着我们不能知道以上代码的输出是:

jim

456

还是

456

jim

awk数组中还可以使用字符串下标,其实,不管你使用的下标是字符串还是数字,awk在幕后还将其认为是字符串下标。举例如下:

代码一:

myarr["1"]="China"

print myarr["1"]

代码二:

myarr["1"]="Mr. Whipple"

print myarr[1]

代码三:

myarr["name"]="Mr. Whipple"

print myarr["name"]

它们都将打印 "China"

删除数组元素使用delete,举例如下:

delete fooarray[1]

另外,如果想要查看是否存在某个特定数组元素,可以使用特殊的"in"布尔运算符,如下所示:

if ( 1 in fooarray ) {

    print "It's there."

} else {

    print "Can't find it."

}

4         第三部分:精通4.1   格式化输出

虽然大多数情况下awkprint语句可以完成任务,但有时我们还需要更多。使用两个函数printf()sprintf(),将能让输出锦上添花。printf()会将格式化字符串打印到stdout,而sprintf()则返回可以赋值给变量的格式化字符串。

从下面例子可以看到,它们几乎与C语言完全相同。

x=1

b="foo"

printf("%s got a %d on the last test\n","Jim",83)

myout=("%s-%d",b,x)

print myout

此代码将打印:

Jim got a 83 on the last test

foo-1

4.2   字符串函数

既然awk把所有变量都当作字符串处理,那么字符串处理对awk就显得尤为重要。但要说明一点,awk不能象在其它语言(如 CC++)中那样将字符串看作是字符数组。例如,如果执行以下代码:

mystring="How are you doing today?"

print mystring[3]

将会接收到一个错误,如下所示:

awk: string.gawk:59: fatal: attempt to use scalar as array

不用担心,awk有许多字符串函数,弥补了这个缺陷。现将常用的字符串函数列举如下:

字符串函数

描述

length()

返回字符串的长度

index()

返回子字符串在另一个字符串中出现的位置

tolower()

返回字符串并且将所有字符转换成小写

toupper()

返回字符串并且将所有字符转换成大写

substr()

返回从字符串中选择的子串

match()

返回子字符串在另一个字符串中出现的位置。它与index()的区别在于它并不搜索子串,它搜索的是正则表达式。

sub()

替换匹配的第一个字符序列,并返回整个字符串

gsub()

替换匹配的全部字符序列,并返回整个字符串

split()

分割字符串,并将各部分放到使用整数下标的数组中

length()返回字符串的长度,例子如下:

print length(mystring)

index()返回子字符串在另一个字符串中出现的位置,如果没有找到该字符串则返回0,例子如下:

print index(mystring,"you")

tolower()toupper()返回字符串并且将所有字符分别转换成小写或大写。注意,tolower()toupper()返回新的字符串,不会修改原来的字符串。例子如下:

print tolower(mystring)

print toupper(mystring)

使用substr()可以从字符串中选择子串。以下是substr()的调用方法:

mysub=substr(mystring,startpos,maxlen)

以下是一个示例:

print substr(mystring,9,3)

match()index()非常相似,它与index()的区别在于它并不搜索子串,它搜索的是正则表达式。match()函数将返回匹配的起始位置,如果没有找到匹配,则返回0。此外,match()还将设置两个变量,叫作RSTARTRLENGTHRSTART包含返回值(第一个匹配的位置),RLENGTH指定它占据的字符跨度(如果没有找到匹配,则返回-1)。通过使用RSTARTRLENGTHsubstr()和一个小循环,可以轻松地遍历字符串中的每个匹配。以下是一个match()调用示例:

print match(mystring,/you/), RSTART, RLENGTH

sub()gsub()是两个字符串替换函数。sub()的调用方法如下:

sub(regexp,replstring,mystring)

调用sub()时,它将在mystring中匹配regexp的第一个字符序列,并且用replstring替换该序列。gsub()sub()的唯一的区别是sub()替换第一个regexp匹配(如果有的话),gsub()则执行全局替换,换出字符串中的所有匹配。举例如下:

sub(/o/,"O",mystring)

print mystring

mystring="How are you doing today?"

gsub(/o/,"O",mystring)

print mystring

其输出结果如下:

HOw are you doing today?

HOw are yOu dOing tOday?

split()的功能是分割字符串,并将分割后的各部分放到使用整数下标的数组中。此函数有三个变量,第一个自变量为要分割的原始字符串,第二个自变量为分割后填入的数组名称,第三个变素为用于指示分割的分隔符。split()返回时,它将返回分割的字符串元素的数量。split()将分割的每一个部分赋值给下标从1开始的数组。举例如下:

numelements=split("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",mymonths,",")

print mymonths[1],mymonths[numelements]

其输出如下:

Jan Dec

最后需要说明一点的是,调用length()sub()gsub()时,可以去掉最后一个变量,这样awk将对$0(整个当前行)应用函数调用。例如要打印文件中每一行的长度,使用以下awk脚本:

{

    print length()

}


head

head [参数]... [文件]...  

命令功能:

head 用来显示档案的开头至标准输出中默认head命令打印其相应文件的开头10行。 

命令参数:

-q 隐藏文件名

-v 显示文件名

-c<字节> 显示字节数

-n<行数> 显示的行数

使用实例:

实例1:显示文件的前n行

命令:

head -n 5 log2014.log

grep

grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。
grep --help
匹配模式选择:
 -E, --extended-regexp     扩展正则表达式egrep
 -F, --fixed-strings       一个换行符分隔的字符串的集合fgrep
 -G, --basic-regexp        基本正则
 -P, --perl-regexp         调用的perl正则
 -e, --regexp=PATTERN      后面根正则模式,默认无
 -f, --file=FILE           从文件中获得匹配模式
 -i, --ignore-case         不区分大小写
 -w, --word-regexp         匹配整个单词
 -x, --line-regexp         匹配整行
 -z, --null-data           一个 0 字节的数据行,但不是空行

杂项:
 -s, --no-messages         不显示错误信息
 -v, --invert-match        显示不匹配的行
 -V, --version             显示版本号
 --help                    显示帮助信息
输入控制:
 -m, --max-count=NUM       匹配的最大数
 -b, --byte-offset         打印匹配行前面打印该行所在的块号码。
 -n, --line-number         显示的加上匹配所在的行号
 --line-buffered           刷新输出每一行
 -H, --with-filename       当搜索多个文件时,显示匹配文件名前缀
 -h, --no-filename         当搜索多个文件时,不显示匹配文件名前缀
 --label=LABEL            print LABEL as filename for standard input
 -o, --only-matching       只显示一行中匹配PATTERN 的部分
 -q, --quiet, --silent      不显示任何东西
 --binary-files=TYPE   假定二进制文件的TYPE 类型;
                                      TYPE 可以是`binary', `text', 或`without-match'
 -a, --text                匹配二进制的东西
 -I                        不匹配二进制的东西
 -d, --directories=ACTION  目录操作,读取,递归,跳过
 -D, --devices=ACTION      设置对设备,FIFO,管道的操作,读取,跳过
 -R, -r, --recursive       递归调用
 --include=PATTERN     只查找匹配FILE_PATTERN 的文件
 --exclude=PATTERN     跳过匹配FILE_PATTERN 的文件和目录
 --exclude-from=FILE   跳过所有除FILE 以外的文件
 -L, --files-without-match 匹配多个文件时,显示不匹配的文件名
 -l, --files-with-matches  匹配多个文件时,显示匹配的文件名
 -c, --count               显示匹配了多少次
 -Z, --null                在FILE 文件最后打印空字符

文件控制:
 -B, --before-context=NUM  打印匹配本身以及前面的几个行由NUM控制
 -A, --after-context=NUM   打印匹配本身以及随后的几个行由NUM控制
 -C, --context=NUM         打印匹配本身以及随后,前面的几个行由NUM控制
 -NUM                      根-C的用法一样的
 --color[=WHEN],
 --colour[=WHEN]       使用标志高亮匹配字串;
 
 -U, --binary               使用标志高亮匹配字串;
 -u, --unix-byte-offsets   当CR 字符不存在,报告字节偏移(MSDOS 模式)

监控网络客户连接数: netstat -n | grep tcp | grep 侦听端口 | wc -l

显示匹配的个数,不显示内容:

[root@krlcgcms01 test]#  cat test|grep -c zhang  
3

匹配system,-i:不区分大小写,-n:显示行号。

[root@krlcgcms01 test]# grep  system test  
[root@krlcgcms01 test]# grep -ni  system test  
9:dbus:x:81:81:System message bus:/:/bin/false 

匹配单词:匹配zhan没有匹配到东西,匹配zhangy能匹配到,因为在test文件中,有zhangy这个单词

[root@krlcgcms01 test]#  cat test|grep -w zhan  
[root@krlcgcms01 test]#  cat test|grep -w zhangy  
zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash  
ba:x:1002:1002::/home/zhangy:/bin/bash  

不匹配以bin开头的行,并显示行号

[root@krlcgcms01 test]# cat test|grep -nv '^bin'  
root:x:0:0:root:/root:/bin/bash
DADddd:x:2:2:daemon:/sbin:/bin/false
mail:x:8:12:mail:/var/spool/mail:/bin/false
ftp:x:14:11:ftp:/home/ftp:/bin/false
&nobody:$:99:99:nobody:/:/bin/false
zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
http:x:33:33::/srv/http:/bin/false
dbus:x:81:81:System message bus:/:/bin/false
hal:x:82:82:HAL daemon:/:/bin/false
mysql:x:89:89::/var/lib/mysql:/bin/false
aaa:x:1001:1001::/home/aaa:/bin/bash
ba:x:1002:1002::/home/zhangy:/bin/bash
test:x:1003:1003::/home/test:/bin/bash
@zhangying:*:1004:1004::/home/test:/bin/bash
policykit:x:102:1005:Po

多文件匹配时,显示匹配文件的文件名

[apacheuser@krlcgcms01 test]$ grep -l 'root' test test2 testbak DAta  
test  
test2  
testbak 

多文件匹配时,在匹配的行前面加上文件名

[apacheuser@krlcgcms01 test]$ grep -H 'root' test test2 testbak  
test:root:x:0:0:root:/root:/bin/bash  
test2:root  
testbak:root:x:0:0:root:/root:/bin/bash  

匹配以root开头或者以zhang开头的行,注意反斜杠

[root@krlcgcms01 test]# cat test |grep '^\(root\|zhang\)'  
root:x:0:0:root:/root:/bin/bash  
zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash  

find

找出文件名为2015-11-11.txt且小于2k的文件并删除

nohup find . -type f -size -2k  -name 2015-11-11.txt |  xargs rm -rf &

nohup find . -mtime +6 -name *.txt -print | xargs rm -rf &

find可谓是aix/linux上使用较多的维护用命令,但很多时候需要用到针对时间的搜索。本文主要对find中搭配atime、ctime和mtime的各种参数进行介绍。

atime:访问时间(access time),指的是文件最后被读取的时间,可以使用touch命令更改为当前时间;
ctime:变更时间(change time),指的是文件本身最后被变更的时间,变更动作可以使chmod、chgrp、mv等等;
mtime:修改时间(modify time),指的是文件内容最后被修改的时间,修改动作可以使echo重定向、vi等等;

以下例子应该很容易理解上述三个时间:某用户在2013年1月5日00:00:00时,在/home下输入ping www.baidu.com > ping.log;5秒钟后,该用户使用ctrl+C强制关闭该命令;5秒钟后,使用cat ping.log查看。则ping.log的ctime为2013-01-05 00:00:00;mtime为2013-01-05 00:00:05;atime为2013-01-05 00:00:10。

这三个参数理解后,我们就可以使用find找到某个时刻进行过某类操作的文件集合。

find . {-atime/-ctime/-mtime/-amin/-cmin/-mmin} [-/+]num

第一个参数,.,代表当前目录,如果是其他目录,可以输入绝对目录和相对目录位置;
第二个参数分两部分,前面字母a、c、m分别代表访问、变更、修改,后面time为日期,min为分钟,注意只能以这两个作为单位;
第三个参数为量,其中不带符号表示符合该数量的,带-表示符合该数量以后的,带+表示符合该数量以前的。

注意:find中对于时间的推算均为:
1、到......为止用+号,从......开始用-号,一个时间单位内的不带符号;
2、数字代表往前偏移量;
3、当前到往后的一个时间单位为基准0;-0就是下限单位;+0就是上限单位。


sort

sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出。如果 File 参数指定多个文件,那么 sort 命令将这些文件连接起来,并当作一个文件进行排序。

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,先以第六个域的第2个字符到第4个字符进行正向排序,再基于第一个域进行反向排序。

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


uniq

用途
报告或删除文件中重复的行。
语法
uniq [ -c | -d | -u ] [ -f Fields ] [ -s Characters ] [ -Fields ] [ +Characters ] [ InFile [ OutFile ] ]
描述
uniq 命令删除文件中的重复行。
uniq 命令读取由 InFile 参数指定的标准输入或文件。该命令首先比较相邻的行,然后除去第二行和该行的后续副本。重复的行一定相邻。(在发出 uniq 命令之前,请使用 sort 命令使所有重复行相邻。)最后,uniq 命令将最终单独的行写入标准输出或由 OutFile 参数指定的文件。InFile 和 OutFile 参数必须指定不同的文件。如果输入文件用“- ”表示,则从标准输入读取;输入文件必须是文本文件。文本文件是包含组织在一行或多行中的字符的文件。这些行的长度不能超出 2048 个字节(包含所有换行字符),并且其中不能包含空字符。
缺省情况下,uniq 命令比较所有行。如果指定了-f Fields 或 -Fields 标志, uniq 命令忽略由 Fields 变量指定的字段数目。 field 是一个字符串,用一个或多个 <空格 > 字符将它与其它字符串分隔开。
如果指定了 -s Characters 或 -Characters 标志, uniq 命令忽略由 Characters 变量指定的字段数目。为 Fields 和 Characters 变量指定的值必须是正的十进制整数。
当前本地语言环境决定了 -f 标志使用的 <空白> 字符以及 -s 标志如何将字节解释成字符。
如果执行成功,uniq 命令退出,返回值 0。否则,命令退出返回值大于 0。
标志
-c 在输出行前面加上每行在输入文件中出现的次数。
-d 仅显示重复行。
-u 仅显示不重复的行。
-f Fields 忽略由 Fields 变量指定的字段数目。如果 Fields 变量的值超过输入行中的字段数目, uniq 命令用空字符串进行比较。这个标志和 -Fields 标志是等价的。
-s Characters 忽略由 Characters 变量指定的字符的数目。如果 Characters 变量的值超过输入行中的字符的数目, uniq 用空字符串进行比较。如果同时指定 -f 和 -s 标志, uniq 命令忽略由 -s Characters 标志指定的字符的数目,而从由 -f Fields 标志指定的字段后开始。 这个标志和 +Characters 标志是等价的。
-Fields 忽略由 Fields 变量指定的字段数目。这个标志和 -f Fields 标志是等价的。
+Characters 忽略由 Characters 变量指定的字符的数目。如果同时指定 - Fields 和 +Characters 标志, uniq 命令忽略由 +Characters 标志指定的字符数目,并从由 -Fields 标志指定的字段后开始。 这个标志和 -s Characters 标志是等价的。
- c 显示输出中,在每行行首加上本行在文件中出现的次数。它可取代- u和- d选项。
- d 只显示重复行 。
- u 只显示文件中不重复的各行 。
- n 前n个字段与每个字段前的空白一起被忽略。一个字段是一个非空格、非制表符的字符串,彼此由制表符和空格隔开(字段从0开始编号)。
+ n 前n个字符被忽略,之前的字符被跳过(字符从0开始编号)。
- f n 与- n相同,这里n是字段数。
- s n 与+n相同,这里n是字符数。
退出状态
该命令返回以下退出值:
0 命令运行成功。
>0 发生错误。
补充
文件经过处理后在它的输出文件中可能会出现重复的行。例如,使用cat命令将两个文件合并后,再使用sort命令进行排序,就可能出现重复行。这时可以使用uniq命令将这些重复行从输出文件中删除,只留下每条记录的唯一样

示例
要删除名为 fruit 文件中的重复行并将其保存到一个名为 newfruit 的文件中,输入:
uniq fruit newfruit
如果 fruit 文件包含下列行:
apples
apples
peaches
pears
bananas
cherries
cherries
则在您运行uniq 命令后 newfruit 文件将包含下列行:
apples
peaches
pears
bananas
cherries
文件/usr/bin/uniq 包含 uniq 命令。

# uniq -c 的用法,例如:
harley
casely
weedly
harley
linda
#cut -c 1-8 | sort | uniq -c > result.txt
1 casely
2 harley
1 linda
1 weekly

1. 显示文件example中不重复的行。
uniq - u example
2. 显示文件example中不重复的行,从第2个字段的第2个字符开始做比较。
uniq - u - 1 +1 example

testfile的内容如下

复制代码
cat testfile
hello
world
friend
hello
world
hello
复制代码

 

直接删除未经排序的文件,将会发现没有任何行被删除

复制代码
#uniq testfile  
hello
world
friend
hello
world
hello
复制代码

 

排序文件,默认是去重

#cat words | 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  


top

top - 12:38:33 up 50 days, 23:15,  7 users,  load average: 60.58, 61.14, 61.22

Tasks: 203 total,  60 running, 139 sleeping,   4 stopped,   0 zombie

Cpu(s)  : 27.0%us, 73.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Mem:   1939780k total,  1375280k used,   564500k free,   109680k buffers

Swap:  4401800k total,   497456k used,  3904344k free,   848712k cached

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                

 4338 oracle    25   0  627m 209m 207m R    0 11.0 297:14.76 oracle                                

 4267 oracle    25   0  626m 144m 143m R    6  7.6  89:16.62 oracle                                

 3458 oracle    25   0  672m 133m 124m R    0  7.1   1283:08 oracle                                

 3478 oracle    25   0  672m 124m 115m R    0  6.6   1272:30 oracle                                

 3395 oracle    25   0  672m 122m 113m R    0  6.5   1270:03 oracle  

第一行同uptime命令运行结果,第二、三行为进程和CPU的信息,第四五行为内存信息

后面的行为进程信息:

列名

含义

PID

进程id

PPID

父进程id

RUSER

Real user name

UID

进程所有者的用户id

USER

进程所有者的用户名

GROUP

进程所有者的组名

TTY

启动进程的终端名。不是从终端启动的进程则显示为 ?

PR

优先级

NI

nice值。负值表示高优先级,正值表示低优先级

P

最后使用的CPU,仅在多CPU环境下有意义

%CPU

上次更新到现在的CPU时间占用百分比

TIME

进程使用的CPU时间总计,单位秒

TIME+

进程使用的CPU时间总计,单位1/100秒

%MEM

进程使用的物理内存百分比

VIRT

进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES

SWAP

进程使用的虚拟内存中,被换出的大小,单位kb。

RES

进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA

CODE

可执行代码占用的物理内存大小,单位kb

DATA

可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb

SHR

共享内存大小,单位kb

nFLT

页面错误次数

nDRT

最后一次写入到现在,被修改过的页面数。

S

进程状态。
            D=不可中断的睡眠状态
            R=运行
            S=睡眠
            T=跟踪/停止
            Z=僵尸进程

COMMAND

命令名/命令行

WCHAN

若该进程在睡眠,则显示睡眠中的系统函数名

Flags

任务标志,参考 sched.h


多U多核CPU监控
在top基本视图中,按键盘数字“1”,可监控每个逻辑CPU的状况:


1. 敲击键盘“b”(打开/关闭加亮效果)

2. 敲击键盘“x”(打开/关闭排序列的加亮效果)

敲击“f”键,top进入另一个视图,在这里可以编排基本视图中的显示字段:


top视图 06

这里列出了所有可在top基本视图中显示的进程字段,有”*”并且标注为大写字母的字段是可显示的,没有”*”并且是小写字母的字段是不显示的。如果要在基本视图中显示“CODE”和“DATA”两个字段,可以通过敲击“r”和“s”键:

查看进程的线程:top -p pid -H

uptime

 9:42  up 1 day, 10:40, 2 users, load averages: 2.60 2.60 2.58

9:42 当前时间
up 1 day 系统运行时间,格式为时:分
2 users 当前登录用户数
load                     averages 系统负载,即任务队列的平均长度。 三个数值分别为  1分钟、5分钟、15分钟前到现在的平均值
   

export

Linux export命令用于设置或显示环境变量。
export JAVA_HOME=$JAVA_7_HOME
export MYENV //定义环境亦量
export MYENV=7 //定义环境亦量并赋值

alias

功能说明:设置指令的别名。
语  法:alias[别名]=[指令名称]
参  数 :若不加任何参数,则列出目前所有的别名设置。
alias ll='ls -alF'

tail

同时tail多个文件
 tail -f chat_error.log -f  chat_biz.log   -f   chat_info.log  

scp

scp是有Security的文件copy,基于ssh登录。操作起来比较方便,比如要把当前一个文件copy到远程另外一台主机上,可以如下命令。
scp -rq /home/daisy/full.tar.gz root@172.19.2.75:/home/root
然后会提示你输入另外那台172.19.2.75主机的root用户的登录密码,接着就开始copy了。
如果想反过来操作,把文件从远程主机copy到当前系统,也很简单。
scp -rq root@/full.tar.gz 172.19.2.75:/home/root/full.tar.gz home/daisy/full.tar.gz
linux 的 scp 命令 可以 在 linux 之间复制 文件 和 目录; 

netstat


netstat -tunlp | grep 进程号/端口号   显示进程和开启了哪些端口或端口被哪个进程占用

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:26327次
    • 积分:779
    • 等级:
    • 排名:千里之外
    • 原创:50篇
    • 转载:23篇
    • 译文:0篇
    • 评论:5条
    文章分类
    最新评论