系统管理 类目

合格的运维工程师必须是一名出色的系统管理员,工欲善其事,必先利其器,本博客会介绍一些系统管理相关的技巧与出色的工具。

学习Linux命令(一)

Linux下的命令到底有多少,没人清楚。但是有一些命令是大多数系统都包含的,这些命令基本上都包含在GNU Coreutils包中。当然也有一些不包含在Coreutils包中,但是也很基本,很实用的软件,例如Sed,Awk,Grep等等。很多人包括我自己可能只用过其中的部分命令,而且即使对这部分命令,也可能只掌握了部分功能而已。另外一方面,网上有很多初学者,面对这么多的命令往往不知道如何下手,频繁着问如何学习Linux命令,因为他们不知道哪些命令有用,哪些参数有用。我们都是从新手走过来,而且学海无涯,我们依然需要不断的学习与总结,这也是我为什么要写这一系列文章的原因所在。

本系列的名称为学习Linux命令 (Learn linux command),至于学习哪些Linux命令,我自己也说不上来,只能说学习一些有用的命令,让人效率提升的命令,并且是一些基本的命令(系统自带的,所以不包括一些工具命令)。在这个系列里,我和各位一样也是一个学生,共同学习。

查看全文

Sed and awk 笔记之 awk 篇:快速了解 Awk(三)

上一篇中,主要介绍了awk中的一些基础概念,包括记录与字段、表达式、变量、语句等等,本篇在此基础上进一步介绍下awk中的函数。

awk的函数分成数学函数、字符串函数、I/O处理函数以及用户自定义的函数,其中用户自定义的函数我们在上一篇中也有简单的介绍,下面我们一一来介绍这几类函数。

数学函数

查看全文

Sed and awk 笔记之 awk 篇:快速了解 Awk(二)

上一篇文章中,我们从awk使用的命令行语法入手,简单介绍了它是如何使用的。在这一篇里,我们要介绍awk编程语言的基本元素和概念,简单介绍它是如何处理文本的。

记录(Record)与字段(Field)

对于数据库来说,一个数据库表是由多条记录组成的,每一行表示一条记录(Record)。每条记录由多列组成,每一列表示一个字段(Field)。Awk将一个文本文件视为一个文本数据库,因此它也有记录和字段的概念。默认情况下,记录的分隔符是回车,字段的分隔符是空白符,所以文本文件的每一行表示一个记录,而每一行中的内容被空白分隔成多个字段。利用字段和记录,awk就可以非常灵活地处理文件的内容。

查看全文

Sed and awk 笔记之 awk 篇:快速了解 Awk(一)

Sed&awk笔记之Sed篇完成之后,我又偷懒了一段时间,昨天狠狠地给自己抽根鞭子,一定要把这半个坑填上。相信看过Sed篇的同学都清楚,这一系列文章虽名日笔记,事实上有很多我自己个人的理解,加上遣词造句都是我自己的内容,所以转载一定要标明出处,详见文章后方。

Awk是什么

Awk、sed与grep,俗称Linux下的三剑客,它们之间有很多相似点,但是同样也各有各的特色,相似的地方是它们都可以匹配文本,其中sed和awk还可以用于文本编辑,而grep则不具备这个功用。sed是一种非交互式且面向字符流的编辑器(a "non-interactive" stream-oriented editor),而awk则是一门模式匹配的编程语言,因为它的主要功能是用于匹配文本并处理,同时它有一些编程语言才有的语法,例如函数、分支循环语句、变量等等,当然比起我们常见的编程语言,Awk相对比较简单。

查看全文

编写 Bash 补全脚本

对于Linuxer来说,自动补全是再熟悉不过的一个功能了。当你在命令行敲下部分的命令时,肯定会本能地按下Tab键补全完整的命令,当然除了命令补全之外,还有文件名补全。

Bash-completion

自动补全这个功能是Bash自带的,但一般我们会安装bash-completion包来得到更好的补全效果,这个包提供了一些现成的命令补全脚本,一些基础的函数方便编写补全脚本,还有一个基本的配置脚本。但也正如之前说的,这个包不是必须的,只不过可以省些力气。

bash-completion这个包的安装位置因不同的发行版会有所区别,但是大致上启用的原理是类似的,一般会有一个名为bash_completion的脚本,这个脚本会在shell初始化时加载。例如对于RHEL系统来说,这个脚本位于/etc/bash_completion,而该脚本会由/etc/profile.d/bash_completion.sh中导入:

# Check for interactive bash and that we haven't already been sourced.
[ -z "$BASH_VERSION" -o -z "$PS1" -o -n "$BASH_COMPLETION" ] && return

# Check for recent enough version of bash.
bash=${BASH_VERSION%.*}; bmajor=${bash%.*}; bminor=${bash#*.}
if [ $bmajor -gt 3 ] || [ $bmajor -eq 3 -a $bminor -ge 2 ]; then
    if shopt -q progcomp && [ -r /etc/bash_completion ]; then
        # Source completion code.
        . /etc/bash_completion
    fi
fi
unset bash bmajor bminor

查看全文

Sed and awk 笔记之 sed 篇:实战

相信大家肯定用过grep这个命令,它可以找出匹配某个正则表达式的行,例如查看包含"the word"的行:

$ grep "the word" filename

但是grep是针对单行作匹配的,所以如果一个短句跨越了两行就无法匹配。这就给我们出了一个题目,如何用sed模仿grep的行为,并且支持跨行短句的匹配呢?

当单词仅出现在一行时很简单,用普通的正则就可以匹配,这里我们用到分支命令,当匹配时则跳转到最后:

/the word/b

查看全文

Sed and awk 笔记之 sed 篇:高级命令(二)

上一篇中介绍了N/D/P三个命令,它们可以形成多行的模式空间,在一点程度上弥补了单行模式空间的不足,我们用sed编辑文本的能力又进了一步。模式空间是sed内部维护的一个缓存空间,它存放着读入的一行或者多行内容。但是模式空间的一个限制是无法保存模式空间中被处理的行,因此sed又引入了另外一个缓存空间——模式空间(Hold Space)。

保持空间

保持空间用于保存模式空间的内容,模式空间的内容可以复制到保持空间,同样地保持空间的内容可以复制回模式空间。sed提供了几组命令用来完成复制的工作,其它命令无法匹配也不能修改模式空间的内容。

操作保持空间的命令如下所示:

名称 命令 说明
保存(Hold) h/H 将模式空间的内容复制或者追加到保持空间
取回(Get) g/G 将保持空间的内容复制或者追加到模式空间
交换(Exchange) x 交换模式空间和保持空间的内容

查看全文

Sed and awk 笔记之 sed 篇:高级命令(一)

上一篇中介绍的基础命令都是面向行的,一般情况下,这种处理并没有什么问题,但是当匹配的内容是错开在两行时就会有问题,最明显的例子就是某些英文单词会被分成两行。

幸运地是,sed允许将多行内容读取到模式空间,这样你就可以匹配跨越多行的内容。本篇笔记主要介绍这些命令,它们能够创建多行模式空间并且处理之。其中,N/D/P这三个多行命令分别对应于小写的n/d/p命令,后者我们在上一篇已经介绍。它们的功能是类似的,区别在于命令影响的内容不同。例如D命令与d命令同样是删除模式空间的内容,只不过d命令会删除模式空间中所有的内容,而D命令仅会删除模式空间中的第一行。

读下一行:N

N命令将下一行的内容读取到当前模式空间,但是下n命令不一样的地方是N命令并没有直接输出当前模式空间中的行,而是把下一行追加到当前模式空间,两行之间用回车符\n连接,如下图所示:

read_newline

模式空间包含多行之后,正则表达式的^/$符号的意思就变了,^是匹配模式空间的最开始而非行首,$是匹配模式空间的最后位置而非行尾。

查看全文