netstat命令使用详解

netstat命令用于显示各种网络信息,如当前机器的网络连接状态,路由表,接口状态等等。

基本信息

执行netstat命令,其结果主要包括两个部分。

  • Active Internet connections (servers and established),称为有源TCP链接,包括TCP和UDP等的详细状态
  • Active UNIX domain sockets (servers and established)。称为有源Unix域套接口。

示例:

1
2
3
4
5
6
7
8
9
10
$netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 2 xx.xx.xx.xx:telnet ss.ss.ss.ss:port ESTABLISHED
...
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 6474 /var/run/test.socket
...

有源TCP链接字段详解:

  • Proto : 当前链接的协议。如TCP,UDP
  • Recv-Q : 网络接收队列
  • Send-Q : 网络发送队列
  • Local Address : 本机的ip:端口(注意此处127.0.0.1默认显示主机名,0.0.0.0默认显示*,端口可能显示别名。若强制显示数字,加-n参数)
  • Foreign Address:对端IP:端口。与local address规则相同
  • State : 当前套接字的网络状态。

有源Unix域套接口字段详解

  • proto : 当前链接的协议,一般为Unix
  • RefCnt : 连接段本端口上的进程号
  • Type:套接字的类型,stream或 DGRAM
  • state : 当前套接字的状态
  • I-Node : 当前socket对应的inode号
  • Path : 连接到套接口的其它进程使用的路径名。

netstat常用参数

  • -a : 显示所有选项
  • -t : 显示所有与TCP相关的选项
  • -u : 显示所有与UDP相关的选项
  • -x : 显示所有与Unix域相关的套接字选项
  • -n : 拒绝显示别名,能显示数字的全部转换为数字显示
  • -p : 显示建立相关连接的程序名。
  • -l : 显示所有状态为Listen的连接
  • -e : 显示扩展信息,如当前链接所对应的用户
  • -c : 间隔一段时间执行一次netstat命令。
  • -s : 显示统计信息。对每种类型进行汇总

netstat常用组合

  • netstat -anp : 显示所有的网络连接,并拒绝显示别名,同时打印该连接对应的程序名
  • netstat -lt : 显示所有正在监听状态的tcp连接
  • netstat -lu : 显示所有正在监听状态的udp连接

Comment and share

Linux ps命令使用详解

ps命令常见使用方法有两种,另外我们可以通过一写参数对ps结果进行筛选和过滤。分别是:

1
2
ps -ef
ps aux

那这两个命令有什么区别呢?下面将对这两个命令进行详细说明和解释。

ps -ef

返回信息的格式:

1
2
3
4
5
6
7
8
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 9月24 ? 00:00:25 /sbin/init
root 2 0 0 9月24 ? 00:00:00 [kthreadd]
root 3 2 0 9月24 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 9月24 ? 00:00:00 [kworker/0:0H]
root 7 2 0 9月24 ? 00:09:13 [rcu_sched]
root 8 2 0 9月24 ? 00:00:00 [rcu_bh]
...

对以上各列信息进行解释:

  • uid : 用户id
  • pid : 当前进程的id
  • ppid : 当前进程的父进程id
  • C : 进程占用CPU的百分比
  • STIME : 进程启动时间
  • CMD : 进程启动命令

上述返回值比较容易理解,不一一解释

ps aux

返回信息的格式:

1
2
3
4
5
6
7
8
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 120060 5392 ? Ss 9月24 0:25 /sbin/init
root 2 0.0 0.0 0 0 ? S 9月24 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 9月24 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 9月24 0:00 [kworker/0:0H]
root 7 0.1 0.0 0 0 ? S 9月24 9:14 [rcu_sched]
root 8 0.0 0.0 0 0 ? S 9月24 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S 9月24 0:00 [migration/0]

对以上信息解释:

  • user : 用户名
  • pid : 进程id
  • %CPU : 进程运行占用CPU的百分比
  • %MEM : 进程占用内存的百分比
  • VSZ : 该进程使用的虚拟内存量,表示一个程序完全驻留在内存中占用的虚拟内存量
  • RSS : 该进程占用的固定内存量
  • TTY : 终端名
  • START : 进程开启时间
  • STAT : 进程的状态
  • TIME : 该进程实际使用的CPU时间
  • COMMAND : 进程运行指令

上述比较重要的信息主要包括VSZ,RSS以及STAT。
VSZ表示一个程序完全驻留在内存中占用的内存量,其包括程序链接的动态链接库的大小,栈的大小以及代码段的大小。(手动算过,但是栈的大小很迷,貌似数组在栈中的大小与同类型变量的大小相同,待验证)。
RSS包括运行过程中实际被加载到内存中的动态链接库,可执行文件以及栈的大小。
STAT为当前进程的运行状态。其包括多种状态,具体解释如下所述:

  • D : 不可中断(通常是IO进程)
  • R : 正在运行或者在队列中的进程
  • S : 处在休眠状态的进程
  • T : 停止或者被追踪
  • Z : 僵尸进程
  • W : 进入内存交换
  • X : 死掉的进程
  • < : 优先级较高的进程
  • n : 优先级较低的进程
  • s : 包含子进程
  • + : 位于后台进程组

可以在上述命令的基础上对查询结果进行筛选,如我们想要对内存占用量进行排序,方法如下:

1
ps aux --sort -pMEM

Comment and share

makefile自动变量与隐晦规则推导

makefile的使用可以大大简化程序编译的过程,不过对于新手来说makefile的执行规则理解起来还是很让人迷糊的。其中最重要的原因是makefile中使用了大量的隐晦规则和自动变量来简化makefile的编写.本节将记录一下makefile自动变量和隐晦规则的推导过程以及makefile的执行流程。

1
2
%.o:%.c
$(CC) -c $(CFLAGS) -o $@ $<

对于上面的推导规则,makefile是怎么将%c文件编译汇编成.o文件的?下面将针对这个问题进行讲解

自动变量

makefile中的自动变量实质上是对一类变量的简写,当我们在模式规则中对这类变量处理的时候可以直接使用自动变量简化makefile代码的编写。自动变量包括如目标文件,依赖文件等。下面以实例的方式列出了一些常用的自动变量:

1
2
a: a.o b.o c.o d.o
g++ -c $(CFLAGS) -o $@ $<
  • $@: 表示模式规则中的目标文件,对于上面的模式规则,$@表示a
  • $<: 表示依赖中的第一个文件.对于上述规则,$<表示a.o
  • $^: 表示所有依赖文件的集合,对于上述规则$^表示a.o b.o c.o d.o
  • $+: 表示所有依赖文件的集合(不去重).对于上述规则$+表示a.o b.o c.o d.o
  • $%: 仅当目标是函数库文件(.a)文件时,表示规则中目标成员名。如一个目标是(test.a(a.o)),此时$%表示a.o, $@表示test.a
  • $?: 所有比目标新的依赖目标的集合
  • $*: 表示目标规则中%以及%之前的部分。如若目标文件为”src/test.o”,目标文件模式为”src/%.o”,此时$*表示”src/test”。

隐晦规则自动规则推导

使用makefile的makefile的隐晦自动规则推导功能也可以让我们的makefile的代码大大简化。使用隐晦规则,我们没必要为每一个类似的规则生成都去写类似的规则。makefile会自动推导依赖文件,并根据隐含规则推导出生成当前目标的命令。
如下面的makefile:

1
2
3
4
5
6
7
8
target: a.o b.o c.o
g++ -o $@ $^ $(LIB) $(INC) $(LINKER)
a.o: a.c
g++ -c $(CFLAGS) -o a.o a.c
b.o: b.c
g++ -c $(CFLAGS) -o b.o b.c
c.o: c.c
g++ -c $(CFLAGS) -o c.o c.c

上述规则没有使用隐晦规则,对于每一个.o文件的生成都写了一条规则语句.若使用隐晦规则推导,上述makefile可写为如下:

1
2
3
4
5
6
7
SOURCE := $(shell find ./ -type f -name *.c)
OBJECTS := $(patsubst *.c,*.o,$(SOURCE))
target : $(OBJECTS)
g++ -o $@ $^ $(LIB) $(INC) $(LINKER)
%.o:%.c
$(CC) -c $(CFLAGS) -o $@ $<

从上面的隐晦规则可以看出,对于.o文件的生成命令,makefile都可以由隐晦规则” $(CC) -c $(CFLAGS) -o $@ $<”推导出。即如当目标需要a.隐晦规则将推导出命令”g++ -c $(CFLAGS) -o a.o a.c”用于生成该目标.

makefile执行过程

由上一节中的makefile简单说一下makefile的执行规则。

1
2
3
4
5
6
7
SOURCE := $(shell find ./ -type f -name *.c)
OBJECTS := $(patsubst *.c,*.o,$(SOURCE))
target : $(OBJECTS)
g++ -o $@ $^ $(LIB) $(INC) $(LINKER)
%.o:%.c
$(CC) -c $(CFLAGS) -o $@ $<

makefile中首先声明了变量SOURCE和OBJECTS,SOURCE是当前文件夹下的所有.c文件的集合,OBJECTS是所有.c文件对应的目标文件.o的集合.

执行过程:
首先,目标target依赖所有的目标文件.o,即a.o,b.o,c.o。当需要依赖a.o时,makefile会根据隐晦规则自动推导出生成a.o文件的命令,(“g++ -c $(CFLAGS) -o a.o a.c”),生成a.o;类似的也会根据同样的过程生成b.o和c.o文件,这三个文件生成之后,再根据上述规则生成target。

makefile中常用函数

wildcard函数

函数参数:一个正则表达式
函数功能:wildcard的中文意思是通配符,它的功能类似于正则表达式,用于展开一列所有符合其参数描述的文件名,文件之间用空格分割。

实例:

1
SOURCE=$(wildcard *.cpp)

此时SOURCE的值为所有的以.cpp为后缀的文件集合,以空格隔开。

patsubst函数

函数参数: 第一个是需要匹配的样式,第二个是表示用什么替换它,第三个被处理的以空格隔开的字符串。
函数功能:其功能是一个匹配替换的函数(pattern substitute)。

实例:

1
2
#TARGET表示与SOURCE中同名的目标文件.
TARGET = $(patsubst *.cpp, *.o, $(SOURCE))

subst函数

1
$(subst <from>,<to>,<text>)

功能:字符串替换,将text中的from 替换为to
实例:

1
2
#返回值:this is b
$(subst a, b, this is a)

strip函数

1
$(strip <string>)

功能:去除头部和尾部的空格
实例:

1
2
#源字符串为"a b c ",返回值为"a b c"
$(strip a b c )

filter函数

1
$(filter <pattern...>,<text...>)

功能:过滤特定模式的字符串
实例:

1
2
#如source为a.c b.s c.h,则下列的返回值为a.c b.s
$(filter *.c *.s, $(source))

word函数

1
$(word <n>,<text>)

函数功能:取单词函数。取出中的第n个单词(从1开始),若越界,返回为空

实例:

1
2
#此函数返回值为bar
$(word 2,foo bar fun)

words函数

1
$(words <text>)

功能:统计字符串中单词的个数,返回个数
实例:

1
2
#此函数返回值为3
$(word foo bar fun)

wordlist函数

1
$(wordlist <s>,<e>,<text>)

功能:取中s-e个单词
实例:

1
2
#返回bar fun
$(wordlist 2,3, foo bar fun)

firstword函数

1
$(firstword <text>)

函数功能:取中的首个单词
实例:

1
2
#返回值为foo
$(firstword foo bar fun)

dir函数

1
$(dir ...)

功能:取给定文件名序列中的目录(即/前面的部分)。如没有/,则返回./
实例:

1
2
#返回值为/home/ ./
$(dir /home/test testfile)

notdir函数

1
$(notdir ...)

功能:取给定文件名序列中的取出非目录部分(即/后面的部分)。
实例:

1
2
#返回值为test testfile
$(notdir /home/test testfile)

suffix函数

1
$(suffix ..)

功能:取后缀函数,若没有后缀返回为空
实例:

1
2
#返回值:.c .c
$(suffix a.c b.c)

basename函数

1
$(basename ...)

功能:取前缀函数,包括目录。
实例:

1
2
#返回值:/home/test a
$(basename /home/test.cpp a.cpp)

addsuffix函数

1
$(addsuffix <suffix> <name....>)

功能:给指定文件序列添加后缀名
实例:

1
2
#返回值:a.c b.c c.c
$(addsuffix .c a b c)

addprefix

1
$(addprefix <prefix> <name...>)

功能:给指定文件序列添加前缀
实例:

1
2
#返回值:src/a src/b src/c
$(addprefix src/ a b c)

join函数

1
$(join <list1> <list2>)

功能:将两个字符串中的list对应项连接
实例:

1
2
3
4
#返回值:an 2b 3
$(join 1 2 3, a b)
#返回值:1a 2b c
$(join 1 2, a b c)

makefile中链接静态库顺序问题

在链接静态库的时候,如果多个静态库之间存在依赖关系,则有依赖的静态库之间存在顺序问题,若顺序出现错误,则可能出现函数未定义或符号找不到等错误。

静态库链接的顺序的原则是:被依赖的库一定要放在后面,因为makefile在链接静态库时的顺序是从右往左(或从后向前).如libb.a依赖于liba.a,此时的链接顺序应该是:-Llibb.a -Lliba.a。

会出现上述问题的原因是:我们在生成静态库的时候并未把依赖库的定义编到生成的库中。如

1
2
3
4
gcc -c a.c
ar cr liba.a a.o
gcc -c b.c
ar cr libb.a b.o # 虽然libb.a使用到了liba.o中的一些函数,但并不会将它们的定义包含进来,所以在链接test时需要指定这两个库

Comment and share

Linux中umask深入理解

umask(user file-creatiopn mode mask)为用户文件创建掩码,是创建文件或文件夹时默认权限的基础。通常我们可以使用chmod修改linux中文件的权限.umask的作用与chmod的效果相反,具体看下面。

若没有文件掩码时,文件的默认权限为0666,文件夹的默认权限为0777。

原因:

  • 创建文件一般是用来读写,所以默认情况下所有用户都具有读写权限,但是没有可执行权限,所以文件创建的默认权限为0666
  • 而文件夹的x权限表示的是打开权限,所以这个权限必须要有,所以文件夹的默认权限为0777。

用户掩码作用

上述的权限是在没有umask情况下的默认权限。但是系统为了保护用户创建文件和文件夹的权限,此时系统会有一个默认的用户掩码(umask),大多数的Linux系统的默认掩码为022。用户掩码的作用是用户在创建文件时从文件的默认权限中去除掩码中的权限。所以文件创建之后的权限实际为:

1
2
#文件创建权限
默认权限(文件0666,文件夹0777)-umask

所以在用户不修改umask的情况下,创建文件的权限为:0666-0022=0644。创建文件夹的权限为:0777-0022=0755

查看与修改默认掩码

查看用户掩码:

1
2
3
4
#以数字方式查看掩码
umask
# 以符号形式查看掩码
umask -S

可以使用umask命令直接修改掩码。

1
umask 0000

上述方法修改的掩码只在当前tty中生效.若要全局生效,可以讲umask值写在/etc/profile或者.bashrc中

Comment and share

linux中ulimit命令简单使用

系统性能是一个受关注的话题,如何通过最简单的设置来实现有效的性能调优,如何在有限资源的条件下保证程序的运作,ulimit是我们在处理问题的时候经常使用的一种手段。ulimit是一种linux系统内置的功能。下面将列举ulimit的一些常用关键字和简单用法。

ulimit命令参数

ulimit参数命令

注意ulimit设置分软硬区别,加-H为硬,-S为软.默认查询是显示的是软,但使用ulimit进行设置的时候为软硬都作用。

参数 功能 示例
-H 设置硬资源限制,一旦设置不能增加。 ulimit – Hs 64;限制硬资源,线程栈大小为 64K。
-S 设置软资源限制,设置后可以增加,但是不能超过硬资源设置。 ulimit – Sn 32;限制软资源,32 个文件描述符。
-a 显示当前所有的 limit 信息。 ulimit – a;显示当前所有的 limit 信息。
-c 最大的 core 文件的大小, 以 blocks 为单位。 ulimit – c unlimited; 对生成的 core 文件的大小不进行限制。
-d 进程最大的数据段的大小,以 Kbytes 为单位。 ulimit -d unlimited;对进程的数据段大小不进行限制。
-f 进程可以创建文件的最大值,以 blocks 为单位。 ulimit – f 2048;限制进程可以创建的最大文件大小为 2048 blocks。
-l 最大可加锁内存大小,以 Kbytes 为单位。 ulimit – l 32;限制最大可加锁内存大小为 32 Kbytes。
-m 最大内存大小,以 Kbytes 为单位。 ulimit – m unlimited;对最大内存不进行限制。
-n 可以打开最大文件描述符的数量。 ulimit – n 128;限制最大可以使用 128 个文件描述符。
-p 管道缓冲区的大小,以 Kbytes 为单位。 ulimit – p 512;限制管道缓冲区的大小为 512 Kbytes。
-s 线程栈大小,以 Kbytes 为单位。 ulimit – s 512;限制线程栈的大小为 512 Kbytes。
-t 最大的 CPU 占用时间,以秒为单位。 ulimit – t unlimited;对最大的 CPU 占用时间不进行限制。
-u 用户最大可用的进程数。 ulimit – u 64;限制用户最多可以使用 64 个进程。
-v 进程最大可用的虚拟内存,以 Kbytes 为单位。 ulimit – v 200000;限制最大可用的虚拟内存为 200000 Kbytes。

ulimit参数作用范围

  • 针对单个tty生效:在tty中直接运行ulimit命令的作用范围是只对当前tty生效
  • 针对单个用户生效:将命令添加到.bashrc中,将对当前用户生效
  • 针对所有用户生效:将命令添加到/etc/security/limits.conf中,可以设置针对特定用户或者所有用户的限制。

Comment and share

Linux正则表达式以及Sed使用学习

正则表达式是熟悉和使用Linux系统的最重要的基础,其中grep,find,awk以及sed等对其依赖更大。本节将总结一下Linux中常用的正则表达式使用方法。

正则表达式中特殊字符

  • . : 表示任何单个字符
  • [] : 包含一个字符序列,表示匹配序列中其中一个字符
  • - : 出现在[]中,表示一个序列范围.如[a-z]表示26个小写的英文字母
  • ^ : 出现在[]中,表示对序列去反。如[^a-z]表示匹配不是a-z的其他字符
  • * : 匹配某一个字符的0个或1个或多个实例
  • ? : 匹配某一个字符的0个或1个实例
  • + : 匹配某一个字符的1个或多个实例
  • $ : 匹配行尾。如test$指匹配以test结尾的行
  • ^ : 匹配行首。如^test指匹配以test开始的行
  • \< : 匹配词首
  • > : 匹配词尾
  • \ : 转移特殊字符,如果需要匹配上述特殊字符,用反斜杠转义

sed使用说明

sed命令:

1
sed [OPTION]... {script-only-if-no-other-script} [input-file]...

sed使用

data文件内容

1
2
3
4
this is a dog a
this is a cat
this is a money
this is a fish

用s命令进行替换

替换时若出现单引号,直接将脚本用双引号括起来即可。
1.将一行中第一个匹配的特定字符串替换

1
sed "s/a/an/" data

注意不会改变原文件,只是会打印到标准输出流。若要保存可以重定向到新的文件中。

2.讲一行中所有匹配的特定字符串匹配,使用g参数

1
sed "s/a/an/g" data

3.使用-i参数直接修改文件内容

1
sed -i "s/a/an/g" data

4.在每一行的开头添加内容

1
sed "s/^/#/" data

5.在每一行的结尾添加内容

1
sed "s/$/#/" data

6.指定特定行替换,或指定特定范围内的行替换

1
2
sed "3s/an/a/" data
sed "1,2s/an/a/" data

7.只替换每一行的第一个a:

1
sed "s/a/an/1" data

8.只替换每一行的第二个a:

1
sed "s/a/an/2" data

9.只替换每一行第二个以后的所有a

1
sed "s/a/an/2g" data

多个匹配

多个匹配可以用分好将匹配规则连接。

1
sed "s/an/a/g;s/dog/cat/g" data

上述命令等价于:

1
sed -e "s/an/a/g" -e "s/dog/cat/g" data

显示被匹配的变量

&可以表示被匹配的变量,即若被匹配的变量为”abc”,则&代表abc。

1
2
#功能为在每个an外加[]
sed -e "s/an/[&]/g" data

圆括号匹配

被圆括号括起来的匹配可以当做变量使用,注意圆括号匹配时括号需要”\”转义。变量按顺序使用\1,\2指代。

1
sed "s/this \(.*\) an \(.*\)/\1:\2/" data

结果:

1
2
3
4
is:dog an
is:cant
is:money
is:fish

sed命令

data内容:

1
2
3
4
this is a dog a
this is a cat
this is a money
this is a fish

N命令

N命令的作用是把下一行的命令纳入当做缓冲区。也就是缓冲区包括两行.

1
2
#只匹配缓冲区的第一个this
sed "N;s/this/that/" data

执行命令结果为:

1
2
3
4
that is a dog a
this is a cat
that is a money
this is a fish

1
sed "N;s/\n/,/" data

执行命令结果为:

1
2
this is a dog a,this is a cat
this is a money,this is a fish

a命令和i命令

  1. i命令的作用是在指定行前面插入一行,行号写在i前面,中间空格可有可无;如果不写行号默认在所有行的前面插入

    1
    2
    #在第一行前面插入 this is my test i
    sed "1i this is my test i" data
  2. a命令的作用是在指定行后追加内容,行号写在a前面,若不写表示所有行后。也可用$代表最后一行,不过一定要有空格.

1
2
#在第一行后插入 this is my test a
sed "1a this is my test a" data
  1. 可以使用匹配来添加
1
2
#若匹配到cat,则在当前行后追加一行 this is test match a
sed "/cat/a this is test match a" data

c命令

c命令是替换匹配的行

1
2
#替换第二行
sed "2 c this is test c" data

结果:

1
2
3
4
this is a dog a
this is test c
this is a money
this is a fish

1
2
#用匹配替换
sed "/fish/c this is the test c" data

结果:

1
2
3
4
this is a dog a
this is a cat
this is a money
this is the test c

d命令

d命令删除指定的行,可指定范围

1
2
#删除第2到3行
sed "2,3 d" data

结果:

1
2
this is a dog a
this is a fish

1
2
#删除找到cat指定的行
sed "/cat/d" data

结果:

1
2
3
this is a dog a
this is a money
this is a fish

1
2
#删除第二行到结尾
sed "2,$ d" data

结果:

1
this is a dog a

p命令

p命令的作用是打印匹配到的行.注意打印的时候使用-n参数。sed默认输出处理后的文本,使用-n参数阻止默认输出。

1
2
#打印匹配到cat的行
sed -n "/cat/p" data
1
2
#打印符合从一个模式当另一个模式的行
sed -n "/dog/,/money/p" data

结果:

1
2
3
this is a dog a
this is a cat
this is a money

1
2
#打印从第一行到匹配到的哪一行
sed -n "1,/cat/p" data

结果:

1
2
this is a dog a
this is a cat

=命令

=参数用于打印匹配到的行号

1
2
#打印含有cat的行号
sed -n "/cat/=" data

综合运用

将下列中所有的100替换为当前行号

1
2
3
4
5
6
7
8
9
10
11
12
13
hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100
hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100
hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100
hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100
hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100
hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100
hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100
hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100
hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100
hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100
hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100
hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100
hmset '99_p_100' 'm_19' 100 't_19' 100 'semm_19' 100

shell命令如下:

1
sed = data | sed "N;s/\([0-9]*\)\n\(hmset '99_p_\)[0-9]*\(' 'm_19' \)[0-9]*\( 't_19' \)[0-9]*\( 'semm_19' \)[0-9]*/\2\1\3\1\4\1\5\1/"

结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
hmset '99_p_1' 'm_19' 1 't_19' 1 'semm_19' 1
hmset '99_p_2' 'm_19' 2 't_19' 2 'semm_19' 2
hmset '99_p_3' 'm_19' 3 't_19' 3 'semm_19' 3
hmset '99_p_4' 'm_19' 4 't_19' 4 'semm_19' 4
hmset '99_p_5' 'm_19' 5 't_19' 5 'semm_19' 5
hmset '99_p_6' 'm_19' 6 't_19' 6 'semm_19' 6
hmset '99_p_7' 'm_19' 7 't_19' 7 'semm_19' 7
hmset '99_p_8' 'm_19' 8 't_19' 8 'semm_19' 8
hmset '99_p_9' 'm_19' 9 't_19' 9 'semm_19' 9
hmset '99_p_10' 'm_19' 10 't_19' 10 'semm_19' 10
hmset '99_p_11' 'm_19' 11 't_19' 11 'semm_19' 11
hmset '99_p_12' 'm_19' 12 't_19' 12 'semm_19' 12
hmset '99_p_13' 'm_19' 13 't_19' 13 'semm_19' 13

Comment and share

Linux查找含有特定字符串的文件

Linux查找含有特定字符串的文件命令为grep。以下为详细的使用方法

grep

Linux命令:

1
2
3
4
grep [OPTIONS] PATTERN [FILE...]
#实例:递归查找当前文件夹下所有含有test的文件,并显示行号
grep -rn "test" *

参数说明

1
2
3
4
5
6
7
8
9
10
11
-r 递归查找
-n 显示行号
-i 忽略大小写
-w 只匹配整个单词,而不是字符串的字部分(如pattern为"test", 不匹配"test1"或"atest")
-C num 显示匹配到的行上下n行
-l 只列出匹配成功的文件名
-L 列出不匹配的文件名
\< 标注单词的开头
\> 标注单词的结尾
^ 指匹配字符串在行首
$ 指匹配字符串在行尾

常用实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#显示匹配pattern1或pattern2的行
grep pattern1 | pattern2 file
# 显示即匹配pattern1又匹配pattern2的行
grep pattern1 file | grep pattern2
#只匹配test或testA,不匹配Atest
grep "\<man" *
#只匹配test或Atest,不匹配testA
grep "man\>" *
#只匹配test 不匹配testA和Atest
grep "\<test\>" *
#匹配行首为test的行:
grep -rn "^test" *
#匹配行尾为test的行
grep -rn "test$" *

Comment and share

Linux常用命令混淆点记录

ls命令单位问题

ls命令的默认单位为字节
若使用ls时需要指定单位显示的时候,需要添加参数-h或–block-size进行操作。具体操作方法如下:

1
2
3
4
5
6
7
8
9
10
11
#-h表示human,即人可读的方式
#它会按照文件的大小显示单位,
#若文件小于1k,则不显示单位,表示字节
#若文件大于1k但是小于1M,显示的单位为k
#文件大于1M小于1G会显示单位为M,
#以此类推
ls -h ~/test
#按照指定的单位显示
#注意使用此参数需要注意一个问题。若文件小于1G
ls --block-size=g ~/test #按照单位为g显示

Comment and share

makefile常用相关函数

makefile中函数的用法与变量类似,变量的用法是在变量前面加上$,函数的用法一样,也是使用$开头,$之后加一个括号,括号中的第一个参数是函数名,后面紧跟此函数需要的参数,用逗号分隔。下面介绍几个常用的函数。

wildcard函数

  • 参数: 一个正则表达式

wildcard的中文意思是通配符,它的功能类似于正则表达式,用于展开一列所有符合其参数描述的文件名,文件之间用空格分割。

实例:

1
SOURCE=$(wildcard *.cpp)

此时SOURCE的值为所有的以.cpp为后缀的文件集合,以空格隔开。

patsubst函数

其功能是一个匹配替换的函数(pattern substitute)。

  • 参数:第一个是需要匹配的样式,第二个是表示用什么替换它,第三个被处理的以空格隔开的字符串。

实例:

1
TARGET = $(patsubst *.cpp, *.o, $(SOURCE))

TARGET表示与SOURCE中同名的目标文件.

$@,$<, $^

上述几个变量的含义:

  • $@ 表示目标的文件名
  • $< 表示依赖中的第一个文件名
  • $^ 表示依赖中所有的文件名

实例:

1
all: library.cpp main.cpp

其中$@标识all, $<表示library.cpp ,$^表示library.cpp main.cpp

Comment and share

魏传柳(2824759538@qq.com)

author.bio


Tencent


ShenZhen,China