0%

通配符 - 命令行的倚天剑、屠龙刀

命令行能干很多GUI图形界面不能做的事情,不知道你的Linux倚天剑、屠龙刀有没有出鞘呢。

很多熟悉Linux命令行的人,对命令行的威力应该叹为观止了。

这其中,我认为通配符,或者广一点来说,正则表达式,真的可以成为天下武林至尊,宝刀屠龙了。

说个最简单的例子

我想拷贝某个文件夹里面的在三个小时内曾经修改过的包含hero的文件。

请大家踊跃发言,如何解决。

下面就说下几个比较常用的通配符。

通配符 匹配项
* 匹配任意多个字符
? 匹配任一单个字符
[characters] 匹配任意一个属于字符集合中的字符
![characters] 匹配任意一个不属于字符集合中的额字符

现在我们执行ls命令,可以看到有下面几个文件:

1
2
ls
ab abb ac ad ae af

实例一 *

匹配任意多个字符

1
2
3
4
5
ls a*
ab abb ac ad ae af
ls ab*
ab abb

实例二 ?

匹配任一单个字符

1
2
3
4
5
ls a?
ab ac ad ae af
ls a??
abb

实例三 [characters]

匹配任意一个属于字符集合中的字符

1
2
➜   ls a[bcd]
ab ac ad

实例四 ![characters]

匹配任意一个不属于字符集合中的额字符

1
2
➜   ls a[!(bcd)]
ae af

通配符 - 命令行的倚天剑、屠龙刀

继续昨天的倚天剑的通配符操作。

为什么分两次:

  • 俺觉得昨天的知道的肯定知道,无外乎复习下
  • 不知道的其实也够一天几分钟的量了

为什么说通配符

  • 后面的很多操作都会用到通配符
  • 通配符不掌握不要说你会用Linux
  • 考虑花几十个tips来说下正则表达式

昨天的都比较简单,今天来点有难度的。

其实我觉得屠龙刀比倚天剑厉害,因为我喜欢灭绝师太,^_^。

首先看下目前文件夹里面都有什么,下面所有的操作都基于这个文件列表:

1
2
➜  ls
1a 1b a12 a123 a13 a14 ab AB abb ABC ac ad ae af b12 b123 b13 b14

实例 [:alnum:] - 匹配任意一个字母或数字

1
2
➜  ls [[:alnum:]]*
1a 1b a12 a123 a13 a14 ab AB abb ABC ac ad ae af b12 b123 b13 b14

实例 [:alpha:] - 匹配任意一个字母

1
2
➜  ls [[:alpha:]]*
a12 a123 a13 a14 ab AB abb ABC ac ad ae af b12 b123 b13 b14

实例 [:digit:] - 匹配任意一个数字

1
2
➜  ls [[:digit:]]*
1a 1b

实例 [:lower:] - 匹配任意一个小写字母

1
2
➜  ls [[:lower:]]*
a12 a123 a13 a14 ab abb ac ad ae af b12 b123 b13 b14

实例 [:upper:] - 匹配任意一个大写字母

1
2
➜  ls [[:upper:]]*
AB ABC

Git Contributor / PR 建议步骤

  1. 首先Fork将要提交的工程,比如原地址为https://github.com/offical/repo.git

  2. clone到本地,并创建一个upstream远程

    1. git clone git@github.com:username/repo.git
    2. git remote add upstream git@github.com:offical/repo.git
  3. 创建自己的特性分支

    1. git checkout -b Name/AmazingFeature
    2. 修改并提交修改 (git commit -m 'Add some AmazingFeature')
    3. 将更新推送到远程分支 (git push origin Name/AmazingFeature)
  4. 登陆到github,提交一个Pull Request到官方repository

  5. 如果PR被接收了,此时可以更新master分支并删除创建的branch

    1. 更新master分支git pull upstream master
    2. 删除branch分支 git branch -D Name/AmazingFeature
  6. 恭喜成为代码贡献者

如果PR出现冲突,解决方式为:

  1. 将源版本库添加为一个远端,并命名为“upstream”(上游)
  2. 从远端抓取最新的内容
  3. 将该仓库的主分支的内容合并到你的分支中
  4. 修复产生的冲突
  5. 再推送回同一个分支

当然,在这个过程中最好不要rebase操作

显示管理磁盘分区 fdisk

.. note::

浮云一别后,流水十年间。

  • 韦应物《淮上喜会梁川故人 》

fdisk是用于检查一个磁盘上分区信息最通用的命令。

fdisk可以显示分区信息及一些细节信息,比如文件系统类型等。

设备的名称通常是/dev/sda、/dev/sdb 等。

对于以前的设备有可能还存在设备名为 /dev/hd* (IDE)的设备,这个设备逐步淘汰了。

fdisk也可以用于创建并操控分区表信息,支持主任GPU、MBR、Sun、SGI和BSD。

块设备可以划分为一个或多个称为分区的逻辑磁盘。这种划分的记录会保存在分区表,通常位于磁盘的第 0 扇区。

fdisk的官方解释为:

fdisk - manipulate disk partition table

语法格式为:

1
2
3
$ fdisk [options] device

$ fdisk -l [device...]

其中一些常用的参数为:

  • -l 列出指定的外围设备的分区表状况
  • -L, --color[=when] :将输出颜色化,其中when可以指定为auto, never or always. 默认为 auto.

显示当前系统的分区情况

这个也是我唯一推荐入门者使用的 命令,仅仅list显示出目前的系统分区。

万万不要输入fdisk执行其他操作,极易格式化硬盘,切记切记。

1
2
3
4
5
6
7
8
9
$ fdisk -l
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.

Disk /dev/sda: 256.1 GB, 256060514304 bytes, 500118192 sectors # 磁盘空间及扇区信息
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: gpt
Disk identifier: FAF37680-0ECE-4BE7-93FC-E87A8F2F6455

存同求异 join

.. note::
劝君莫惜金缕衣,劝君惜取少年时。

  • 杜秋娘《金缕衣》

Linux join命令用于将两个文件中指定栏位内容相同的行连接起来。

找出两个文件中,指定栏位内容相同的行,并加以合并,再输出到标准输出设备。

类似于SQL的JOIN操作

官方解释为:

join - join lines of two files on a common field

语法为:

1
$  join [OPTION]... FILE1 FILE2

这个命令的参数还是有一些的,不过基本默认的足够使用了。

join实例

最简单的连接两个文件。

首先看一下两个文件的内容,然后进行join操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 查看file1、file2 的文件内容:
$ cat file1
Zhangsan age 14
Lisi age 15
Wangwu age 16

$ cat file2
Zhangsan score 80
Lisi score 90
Wangwu score 85

# 使用join命令
$ join file1 file2
Zhangsan age 14 score 80
Lisi age 15 score 90
Wangwu age 16 score 85

# 交互两个文件的顺序
$ join file2 file1
Zhangsan score 80 age 14
Lisi score 90 age 15
Wangwu score 85 age 16

可以看到交换顺序对输出是有影响的,会影响到最终的输出内容。

不同的栏内容进行join操作

而如果两个文件的内容不同,那么在进行join操作时会有警告信息输出,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ cat file1       
Jialiu age 15
Zhangsan age 14
Lisi age 15
Wangwu age 16
$ cat file2
Zhangsan score 80
Lisi score 90
Wangwu score 85
Jialiu score 88
$ join file1 file2
join: file1:3: is not sorted: Lisi age 15
join: file2:2: is not sorted: Lisi score 90
Zhangsan age 14 score 80
Lisi age 15 score 90
Wangwu age 16 score 85
$ join file2 file1
join: file2:2: is not sorted: Lisi score 90
join: file1:3: is not sorted: Lisi age 15
Zhangsan score 80 age 14
Lisi score 90 age 15
Wangwu score 85 age 16

TODO

语法

1
join [-i][-a<1或2>][-e<字符串>][-o<格式>][-t<字符>][-v<1或2>][-1<栏位>][-2<栏位>][--help][--version][文件1][文件2]

参数

  • -a<1或2> 除了显示原来的输出内容之外,还显示指令文件中没有相同栏位的行。
  • -e<字符串> 若[文件1]与[文件2]中找不到指定的栏位,则在输出中填入选项中的字符串。
  • -i或–igore-case 比较栏位内容时,忽略大小写的差异。
  • -o<格式> 按照指定的格式来显示结果。
  • -t<字符> 使用栏位的分隔字符。
  • -v<1或2> 跟-a相同,但是只显示文件中没有相同栏位的行。
  • -1<栏位> 连接[文件1]指定的栏位。
  • -2<栏位> 连接[文件2]指定的栏位。

-a FILENUM
also print unpairable lines from file FILENUM, where FILENUM is 1 or 2, corresponding to FILE1 or FILE2

-e EMPTY
replace missing input fields with EMPTY

-i, –ignore-case
ignore differences in case when comparing fields

-j FIELD
equivalent to ‘-1 FIELD -2 FIELD’

-o FORMAT
obey FORMAT while constructing output line

-t CHAR
use CHAR as input and output field separator

-v FILENUM
like -a FILENUM, but suppress joined output lines

-1 FIELD
join on this FIELD of file 1

-2 FIELD
join on this FIELD of file 2

–check-order
check that the input is correctly sorted, even if all input lines are pairable

–nocheck-order
do not check that the input is correctly sorted

–header
treat the first line in each file as field headers, print them without trying to pair them

-z, –zero-terminated
line delimiter is NUL, not newline

   Unless -t CHAR is given, leading blanks separate fields and are ignored, else fields are separated by CHAR.  Any FIELD is a  field
   number counted from 1.  FORMAT is one or more comma or blank separated specifications, each being 'FILENUM.FIELD' or '0'.  Default
   FORMAT outputs the join field, the remaining fields from FILE1, the remaining fields from FILE2, all separated by CHAR.  If FORMAT
   is the keyword 'auto', then the first line of each file determines the number of fields output for each line.

   Important:  FILE1 and FILE2 must be sorted on the join fields.  E.g., use "sort -k 1b,1" if 'join' has no options, or use "join -t
   ''" if 'sort' has no options.  Note, comparisons honor the rules specified by 'LC_COLLATE'.  If the input is not sorted  and  some
   lines cannot be joined, a warning message will be given.

​ comm(1), uniq(1)

为工程生成目标文件

语法:

1
2
3
add_executable(<name> [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
source1 [source2 ...])

简单的例子如下:

1
2
3
add_executable(demo
main.cpp
)

查找库所在目录FIND_LIBRARY

语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
find_library (
<VAR>
name | NAMES name1 [name2 ...] [NAMES_PER_DIR]
[HINTS path1 [path2 ... ENV var]]
[PATHS path1 [path2 ... ENV var]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_DEFAULT_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_CMAKE_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)

例子如下:

1
FIND_LIBRARY(RUNTIME_LIB mylib /usr/lib  /usr/local/lib NO_DEFAULT_PATH)

cmake会在目录中查找,如果所有目录中都没有,值RUNTIME_LIB就会被赋为NO_DEFAULT_PATH

添加头文件目录INCLUDE_DIRECTORIES

语法:

1
include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

它相当于g++选项中的-I参数的作用,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用。

1
include_directories(/include/path/)

添加需要链接的库文件目录LINK_DIRECTORIES

语法:

1
link_directories(directory1 directory2 ...)

它相当于g++命令的-L选项的作用,也相当于环境变量中增加LD_LIBRARY_PATH的路径的作用。

1
link_directories("/lib/directory/")

添加需要链接的库文件路径LINK_LIBRARIES

语法:

1
link_libraries(library1 <debug | optimized> library2 ...)

直接是全路径

1
link_libraries(“/home/server/third/lib/libcommon.a”)

下面的例子,只有库名,cmake会自动去所包含的目录搜索

1
link_libraries(iconv)

传入变量

1
link_libraries(${RUNTIME_LIB})

也可以链接多个

1
link_libraries("/the/path/of/lib1.so" "/the/path/of/lib2.so")

可以链接一个,也可以多个,中间使用空格分隔.

message

给用户显示一个信息.

1
message([<mode>] "message to display" ...)

The optional keyword determines the type of message:

1
2
3
4
5
6
7
8
9
10
(none)         = Important information
STATUS = Incidental information
WARNING = CMake Warning, continue processing
AUTHOR_WARNING = CMake Warning (dev), continue processing
SEND_ERROR = CMake Error, continue processing,
but skip generation
FATAL_ERROR = CMake Error, stop processing and generation
DEPRECATION = CMake Deprecation Error or Warning if variable
CMAKE_ERROR_DEPRECATED or CMAKE_WARN_DEPRECATED
is enabled, respectively, else no message.

The CMake command-line tool displays STATUS messages on stdout and all other message types on stderr. The CMake GUI displays all messages in its log area. The interactive dialogs (ccmake and CMakeSetup) show STATUS messages one at a time on a status line and other messages in interactive pop-up boxes.

CMake Warning and Error message text displays using a simple markup language. Non-indented text is formatted in line-wrapped paragraphs delimited by newlines. Indented text is considered pre-formatted.