Category Archives: Linux

学习 Linux-IBM developerWorks

学习 Linux,101: 创建和更改硬链接和符号链接
学习如何创建和管理到 Linux 系统上文件的硬链接和符号链接。可以使用本文中的资料来准备 Linux 系统管理员认证的 LPI 101 考试,或者只是探究硬链接与软链接或符号链接之间的区别,以及链接文件(而不是复制文件)的最佳方法。
学习 Linux,101: 文件和目录管理
您或许听说过,Linux 中的所有资源都被视为文件,所以请选择正确的学习途径,掌握文件和目录管理的扎实基础知识:查找、列出、移动、复制和存档。利用本教程中的材料来学习 Linux Professional Institute LPIC-1:Linux 服务器专业认证考试 101,或者仅为了兴趣而学习。
学习 Linux,101: 控制文件系统的安装和卸载
学习安装您的 Linux 文件系统;配置和和使用可移动 USB、IEE 1394 或其他设备;正确访问软盘、CD、和 DVD。您可以使用本文中提供的资料来研究 Linux 系统管理认证的 LPI 101 考试,或者只学习关于访问 Linux 文件系统的信息。
学习 Linux,101: 管理共享库
学习如何为 Linux 中可执行程序选择共享库以及如何加载共享库。 您可以使用本文中的资料来学习,备考 Linux 系统管理员认证的 LPI 101 考试,当然也可以是出于爱好而学习。
学习 Linux,101: LPIC-1 路线图
使用这个路线图,查找可以帮助您学习和复习基本 Linux 任务的 IBM developerWorks 文章。并且,如果您正在准备面向 Linux 系统管理员的专业认证,那么这些文章可以帮助您准备 Linux Professional Institute Certification (LPIC) 考试 101 和考试 102。这个路线图是根据 101 和 102 考试的目标 43 组织的,您需要通过这两门考试来获得 LPI 级别 1 认证。
学习 Linux,101: Debian 包管理
学习如何在 Linux 系统上安装、升级和管理包。本文主要关注 Advanced Packaging Tool (APT),APT 是 Debian 以及从 Debian 衍生出的发行版(比如 Ubuntu)使用的包管理系统。可以使用本文中的资料来准备 Linux 系统管理员认证的 LPI 101 考试,或者只是为了了解添加新软件并及时更新系统的最佳方法。
学习 Linux,101: 使用正则表达式搜索文本文件
了解如何使用正则表达式,如何使用它们在文件系统中查找所需内容。本文提供的材料可以帮助您准备 Linux 系统管理员认证 LPI 101 考试,也可以作为一般的兴趣读物。
学习 Linux,101: 进程执行优先级
了解如何设置和更改进程优先级,以便应用程序获得它们需要的进程时间。本文提供的材料可以帮助您准备 Linux 系统管理员认证 LPI 101 考试,也可以作为一般的兴趣读物。
学习 Linux,101: 自定义或编写简单脚本
学习如何使用标准的 shell 语法、循环和控制结构,以及成功或失败测试来自定义现有脚本或编写简单的新 bash 脚本。您可以使用本教程中的资料学习针对 Linux 系统管理员认证的 LPI 102 考试内容,或者仅为兴趣而学习。
学习 Linux,101: RPM 和 YUM 包管理
学习如何在 Linux 系统上安装、升级和管理包。本文主要关注由 Red Hat 开发的 Red Hat Package Manager (RPM),以及 Duke University 物理系最初为管理 Red Hat Linux 系统开发的 Yellowdog Updater Modified (YUM)。可以使用本文中的资料来准备 Linux 系统管理员认证的 LPI 101 考试,或者只是为了了解添加新软件并及时更新系统的最佳方法。
学习 Linux,101: 引导系统
了解如何在引导进程中引导您的 Linux 系统。您可以使用本文中的材料准备 Linux 系统管理员认证 LPI 101 考试,或者只是了解一下该引导过程。
学习 Linux,101: 使用 vi 编辑文件
了解如何使用 vi 编辑器,这款编辑器在大部分 UNIX 和 Linux 系统中都存在。本文提供的材料可以帮助您准备 Linux 系统管理员认证 LPI 101 考试,也可以作为一般的兴趣读物。
学习 Linux,101: 管理文件权限和所有权
学习在您的 Linux 文件系统上管理所有权和权限。了解访问模式,如 suid,sgid 和粘贴位,以及如何使用它们加强安全性。您可以使用本文中的资料来准备 Linux 系统管理员认证的 LPI 101 考试,或者只是了解文件所有权、权限和安全性。
学习 Linux,101: 保持文件系统的完整性
学习如何检查 Linux 文件系统的完整性、监控磁盘可用空间并修复简单问题。您可以使用本文中的资料来准备 Linux 系统管理员认证的 LPI 101 考试,或者只是检查您的文件系统,将其管理得井然有序,特别是在一次系统故障或断电之后。
学习 Linux,101: 创建分区和文件系统
学习如何在磁盘驱动器上创建分区,以及如何格式化分区以便将其用作 Linux 系统上的交换或数据空间。您可以使用本文中的资料来准备 Linux 系统管理员认证的 LPI 101 考试,或者只是探究自己使用的分区和 Linux 文件系统。
学习 Linux,101: 文件和目录管理
您可能已经听说过 “Linux 中的每项内容都可以看作一个文件”,那么就让我们通过牢固地掌握文件和目录管理内容来开始我们的 Linux 学习吧 —— 寻找、列出、移动、复制和归档。您可以利用本文的内容来准备 Linux 系统管理员认证 LPI 101 考试,或者仅仅是从中获取乐趣。
学习 Linux,101: 管理磁盘配额
学习如何设置和检测 Linux 文件系统的磁盘配额,防止个人用户使用超过允许范围的空间,避免造成整个文件系统的意外拥堵。您可以使用本文中的资料来准备 Linux 系统管理员认证的 LPI 101 考试,或者只是探究配额。
学习 Linux,101: 创建、监控和终止进程
了解 Linux 上的进程管理:如何在前台和后台之间切换进程,找出正在运行的程序,终止进程,以及在外出时让进程继续运行。本文提供的材料可以帮助您准备 Linux 系统管理员认证 LPI 101 考试,也可以作为一般的兴趣读物。
学习 Linux,101: 管理磁盘配额
学习设置和检查 Linux 文件系统上的磁盘配额,预防用户使用超出允许量的空间,还要预防整个文件系统被意外填满。您可使用本教程中的资料学习针对 Linux 系统管理员认证的 LPI 101 考试内容,或者仅了解配额。
学习 Linux,101: 硬盘布局
了解如何在 Linux 系统中设计磁盘的分区布局。您可以使用本文中的资料来学习,备考 Linux 系统管理员认证的 LPI 101 考试,当然也可以是出于爱好而学习。
学习 Linux,101: 维护文件系统的完整性
学习如何检查您的 Linux 文件系统的完整性,如何监视空闲空间,以及如何修复简单的问题。您可以使用本教程中的资料进行 Linux Professional Institute (LPI) 101 Linux 系统管理员认证考试备考,或者仅使用它们来检查您的文件系统,并让文件系统保持良好的工作秩序,尤其在系统崩溃或断电后。
学习 Linux,101: 创建分区和文件系统
学习如何在磁盘驱动器上创建分区,如何格式化它们以在 Linux 系统上用作交换或数据空间。您可以使用本教程中的资料来为 Linux Professional Institute LPIC-1:Linux 服务器专业认证考试 101 备考,或者仅为了自己的使用而了解分区和 Linux 文件系统。
学习 Linux,101: 流、管道和重定向
您是不是认为流和管道让 Linux 专家听起来像管道工?现在您就有机会了解流和管道以及如何重定向和分离流。您甚至还将了解如何将流转变成命令参数。您可以为准备 Linux 系统管理员认证考试 LPI 101 而学习本文,也可以仅仅是为了从中获得乐趣。
学习 Linux,101: 查找并放置文件系统
学习一个 Linux 系统上 Filesystem Hierarchy Standard (FHS) 下文件的正确位置,并学习如何查找重要文件和命令。您可以使用本文中的资料来准备 Linux 系统管理员认证的 LPI 101 考试,或者只是探究文件组织和管理。
学习 Linux,101: 引导管理器
了解如何为您的 Linux 系统选择和配置一个引导程序。您可以使用本文中的资料来学习,为参加 Linux 系统管理员认证的 LPI 101 考试而做准备,当然也可以是出于爱好而学习。
学习 Linux,101: 运行级别、引导目标、关闭和重新引导
学习关闭并重新引导 Linux系统,警告用户系统即将关闭,切换到限制更多或更少的运行级别。您可以使用本文中的资料学习 LPIC-1:Linux 服务器专业认证,或者单纯地学习关闭、重新引导和更改运行级别。这些资料对应于 LPI 2015 年 4 月 4.0 版目标。
学习 Linux,101: 自定义和使用 shell 环境
学习如何自定义 Linux shell 环境和编写简单的 bash 函数。您可以使用本教程中的资料学习针对 Linux 系统管理员认证的 LPI 102 考试内容,或者仅为兴趣而学习。
学习 Linux,101: Linux 命令行
GUI 很有用,但要释放 Linux 的真正威力,命令行是必不可少的。在本教程中,Ian Shields 将介绍 bash shell 的一些主要特性,重点介绍对 LPI 认证很重要的一些特性。学完本教程后,您将学会使用 echo 和 exit 等基本 Linux 命令,设置环境变量,以及收集系统信息。使用本教程中的资料学习 Linux Professional Institute LPIC-1:Linux 服务器专业认证考试 101,或者仅为兴趣而学习。
学习 Linux,101: 流、管道和重定向
如果您认为流和管道使 Linux 专家听起来像是水管工,那么您现在就有一个了解它们的机会,了解如何重定向和拆分它们。您甚至还可以了解如何将流转换为命令参数。您可以使用本教程中的资料学习针对 Linux 系统管理员认证的 LPI 101 考试内容,或者仅为了兴趣而学习。
学习 Linux,101: 创建、监视和结束进程
学习 Linux 上的进程管理:如何在前台和后台之间切换进程,找到正在运行的进程,结束进程,在您某天离开后保持进程继续运行,并了解终端窗口中的多任务。您可以使用本教程中的资料学习 Linux Professional Institute LPIC-1:Linux 服务器专业认证考试 101,或者仅为了兴趣而学习。
学习 Linux,101: 控制文件系统的挂载和卸载
学习挂载 Linux 文件系统;配置和使用可移动 USB、IEE 1394 或其他设备;以及正确地访问软盘、CD 和 DVD。您可以使用本教程中的资料学习针对 Linux 系统管理员认证的 LPI 101 考试内容,或者仅学习访问 Linux 文件系统。
学习 Linux,101: 管理文件权限和所有权
学习管理您的 Linux 文件系统上的文件所有权和权限。了解访问模式,比如 suid、sgid 和粘滞位 (sticky bit),以及如何使用它们提高安全性。您可以使用本教程中的资料学习针对 Linux 系统管理员认证的 LPI 101 考试内容,或者只是了解文件所有权、权限和安全性。
学习 Linux,101: 查找和放置系统文件
了解在文件系统层级标准 (FHS) 下文件在 Linux 系统上的正确位置,了解如何找到重要的文件和命令。您可以使用本教程中的资料学习针对 Linux 系统管理员认证的 LPI 101 考试内容,或者只是了解文件组织和管理。
学习 Linux,101: 使用基本 SQL 命令
学习如何使用基本 SQL 命令查询数据库和操作数据。您可以使用本教程中的资料学习针对 Linux 系统管理员认证的 LPI 102 考试内容,或者仅为兴趣而学习。
学习 Linux,101: 文本流和过滤器
文本处理操作远不止剪切和粘贴,尤其在未使用 GUI 时。在本教程中,Ian Shields 将介绍如何在 Linux 上使用来自 GNU textutils 包的过滤器处理文本。在学习本教程后,您就能像专家一样处理文本。您可以使用本教程中的资料学习针对 Linux Professional Institute LPIC-1:Linux 服务器专业认证的 101 考试内容,或者仅为兴趣而学习。
学习 Linux,101: LPIC-1 学习路线图
使用此路线图查找 IBM developerWorks 教程,这些教程可帮助您学习和复习基本的 Linux 任务。如果您想要通过 Linux 系统管理员专业认证,这些教程可帮助您了解 Linux Professional Institute 的 LPIC-1:Linux 服务器专业认证考试 101 和 102 的知识点。此路线图根据考试 101 和 102 中的 43 个目标而组织,通过 LPIC-1 认证需要掌握这些目标。
学习 Linux,101: Debian 包管理
学习如何在 Linux 系统上安装、升级和管理包。本教程主要关注 Advanced Packaging Tool(或 APT),APT 是 Debian 以及从 Debian 衍生出的发行版(比如 Ubuntu)使用的包管理系统。您可以使用本教程中的资料学习针对 Linux 系统管理员认证的 LPI 101 考试内容,或者只是为了了解添加软件和保持系统最新的最佳方法而学习。
学习 Linux,101: 管理共享库
学习如何确定 Linux 可执行程序依赖于哪些共享库,以及如何加载它们。您可以使用本教程中的资料学习针对 Linux 系统管理员认证的 LPI 101 考试内容,或者仅为兴趣而学习。
学习 Linux,101: 安装引导管理器
学习如何为您的 Linux 系统选择和配置引导管理器。 您可以使用本教程中的资料学习针对 Linux 系统管理员认证的 LPI 101 考试内容,或者仅为兴趣而学习。
学习 Linux,101: 引导系统
学习通过引导过程引导您的 Linux 系统。您可以使用本教程中的资料学习针对 Linux 系统管理员认证的 LPIC-1 101 考试内容,或者仅学习引导过程。这些资料对应于 2015 年 4 月 LPI V4.0 考试目标。
学习 Linux,101: 使用正则表达式搜索文本文件
学习如何使用正则表达式在文件系统上的文件中查找信息。您可以使用本教程中的资料学习针对 Linux 系统管理员认证的 LPI 101 考试内容,或者仅为兴趣而学习。
学习 Linux,101: 管理用户和组帐户及相关系统文件
学习如何管理用户和组帐户及相关系统文件。您可以使用本教程中的资料学习针对 Linux 系统管理员认证的 LPI 102 考试内容,或者仅为了兴趣而学习。
学习 Linux,101: 创建和更改硬链接和符号链接
学习如何创建和管理您的 Linux 系统上的文件的硬链接和符号链接。您可以使用本教程中的资料学习针对 Linux 系统管理员认证的 LPI 101 考试内容,或者仅了解硬链接与软或符号链接之间的差异,以及链接到文件而不是复制文件的最佳方式。
学习 Linux,101: 使用 vi 编辑文件
学习如何使用几乎每个 UNIX 和 Linux 系统上都有的 vi 编辑器。您可以使用本教程中的资料学习针对 Linux 系统管理员认证的 LPI 101 考试内容,或者仅为兴趣而学习。
学习 Linux,101: 文本流和过滤器
文本操作不仅仅是指复制和粘帖,在不使用 GUI 的情况下,这一点尤其明显。通过本文为 Linux Professional Institute Certification (LPIC) 101 考试做准备,或者仅仅是从中得到乐趣。在这篇文章中,Ian Shields 向您介绍了在 Linux 上使用 GNU 文本实用程序(textutils)包中的过滤器进行文本操作。在阅读完本文后,您将能够像专家一样熟练地操作文本。
学习 Linux,101: Linux 命令行
GUI 非常优秀,但是要释放 Linux 的真正威力,命令行是任何东西都无法取代的。在这篇文章中,Ian Shields 为您介绍了 bash shell 的一些主要特性,并重点介绍对 LPI 认证非常重要的特性。阅读完本文后,您将可以非常熟练地使用基本的 Linux 命令,比如 echo 和 exit、设置环境变量,以及收集系统信息。

Shell脚本编程总结及速查手册

Shell是一种编程语言, 它像其它编程语言如: C, Java, Python等一样也有变量/函数/运算符/if语句/循环控制/… 但在开始之前, 我想先理清Shell语言与Shell之间的关系.

Shell与Shell语言

上面说了Shell是一种编程语言但你可能也听说过: sh/bash/csh/zsh/…它们也叫Shell, 实际上这里所说的Shell是一种应用程序, 它负责解释执行你编写的Shell脚本, Mac默认就自带了sh/bash/csh/zsh/tcsh/ksh, 你可以这样查看cat /etc/shells
不同的shell的用法基本相同, 但有些shell提供了一些新特性, 比如我现在在用的就是zsh, 更多zsh的内容可以去看这篇文章。

第一个Shell脚本

#! /bin/sh
echo "hello shell!"

依国际惯例这里以在终端里打印一句hello shell!开始, 第一行的#!是一个约定标记, 它告诉脚本这段脚本需要什么解释器来执行. 第二行的echo命令则负责向屏幕上输出一句话.

如何运行

运行shell程序有3种方法:

  1. chmod +x使文件具有可执行权限, 直接运行
  2. 直接调用解释器, 将脚本文件作为参数传入 (比如bash hi.sh)
  3. 使用source(也可用 . 代替)执行文件

通常情况下, 最方便的方式就是方式1, 通过方式1执行你需要在脚本第一行写好这段脚本由哪个解释器来解释, 而通过方式2来执行则没有这个限制, 写了也没用.
除此之外方式1与方式2执行命令就没有区别了, 但方式3执行的方式与前两种都不同:

使用source执行shell脚本时, 不会创建子进程, 而是在父进程中直接执行!

这里不作更多解释, 感兴趣的同学可以去参考Linux Shell编程从入门到精通这本书的第一章的相关部分.

变量

和其它语言一样Shell中也有变量, 而且更简单, 但有一些比较特殊的地方.

  1. Shell中的变量只有字符串这一种类型
  2. Shell中变量名与变量值没有长度限制
  3. Shell的变量也允许比较操作和整数操作, 只要变量中的字符串为数字

定义变量

variable_name=ghui

需要注意: = 两边不能加空格, 当赋值语句包含空格时请加引号(单引号/双引号均可)比如:

variable_name="ghui's blog"

Shell中的变量可以分为两种类型:

  1. 局部变量 (定义变量时在前面加local修饰符)
  2. 全局变量 (定义变量时不加任何修饰符)

与其它语言一样局部变量的可见范围是代码块或函数内, 全局变量在全局范围内可见.看个简单的例子:

#! /bin/sh
num=111 #全局变量
 
func1()
{
  local num=222 #局部变量
  echo $num
}
 
echo "before---$num"
func1
echo "after---$num"

输出:

before---111
222
after---111

使用变量

使用一个定义过的变量, 只要在变量名前面加$即可, 如:

name=ghui
echo $name
echo ${name} #{} 为了帮助解释器识别变量边界, 非必须

在使用变量时还有一个地方需要注意, 请看下面的例子:

#! /bin/sh
str='abc'
echo "1 print $str"
echo '2 print $str'

输出:

1 print abc
2 print $str

即:
被双引号括起来的变量会发生变量替换, 单引号不会

注释

Shell中注释使用#, 而且它不支持多行注释.

常用的字符串操作

字符串拼接

name="shell"
sayHi="hello, "$name" !"
sayHi2="hello, ${name} !"
echo $sayHi $sayHi2

注意: 上面说的单双引号引起的变量替换问题

获得字符串长度

string="abcd"
echo ${#string} #输出:4

截取字符串

str="hello shell"
echo ${str:2}  #输出: llo shell
echo ${string:1:3} #输出:ell

更多关于字符串的操作可以看这个

if/else流程控制

基本语法结构:

if condition
then 
	 do something
elif condition
then 
	do something
elif condition
then 
	do something
else
	do something
fi

其中, elif语句和else语句非必须的.看个例子:

#! /bin/sh
a=1
if [ $1=$a ]
then
	echo "you input 1"
elif [ $1=2 ]
then
	echo "you input 2"
else
	#do nothing
	echo " you input $1"
fi

很简单, 不过这里有两个地方需要注意, 如果某个条件下的执行体为空, 则你就不能写这个条件 即下面这样会报错:

if condition
then 
	#do nothing
elif condition
then 
	# do nothing
#or
else
	#do nothing

另外, [ ] 两边一定要加空格, 下面这样都会报错:

if [$a=$b]
#or 
if [ $a=$b]
#or 
if [$a=$b ]

只有这样if [ $a=$b ]才是对的.
注意: 实际上这里的[]test命令的一种形式, [是系统的一个内置命令,存在路径是/bin/[,它是调用test命令的标识, 右中括号是关闭条件判断的标识, 因此下面的两个测试语句是等效的:

if test "2>3"
then
	...
fi

if [ "2>3" ]
then 
	...
fi

[]之外, shell语言中还有几种其它括号, 比如: 单小括号/双小括号/双中括号/… , 不同的括号有不同的用法, 更多关于shell中, 括号的用法可以看看这个

switch流程控制

当条件较多时, 可以选择使用switch语句, shell中的switch语句的写法和其它语言还是有些不同的, 基本结构如下:

case expression in
	pattern1)
		do something... ;;
	pattern2)
		do something... ;;
	pattern2)
		do something... ;;
	...
esac

看个例子:

#! /bin/sh
input=$1
case $input in
        1 | 0)
        str="一or零";;
        2)
        str="二";;
        3)
        str="三";;
        *)
        str=$input;;
esac
echo "---$str"

这个例子会根据你执行此脚本时传入的参数不同在屏幕上输出不同的值, 其中第一个case 1 | 0代表逻辑或.
NOTE:

  1. ;;相当于其它语言中的break
  2. 每个pattern之后记得加)
  3. 最后记得加esac (即反的case)

for循环

基本结构:

for name [in list]
do
	...
done

其中,[]括起来的 in list, 为可选部分, 如果省略in list则默认为in "$@", 即你执行此命令时传入的参数列表.
看个例子:

for file in *.txt
do
	open $file
done

遍历当前目录下的所有txt文件, 并依次打开.

while循环

基本结构:

while condition
do
	do something...
done

看个例子:

#! /bin/sh
i=0
while ((i<5));
do
	((i++))
	echo "i=$i"
done

输出:

i=1
i=2
i=3
i=4
i=5

NOTE: 你可能需要去了解一下(())的用法

until循环

基本结构

until condition
do
	do something...
done

看个例子:

#! /bin/sh
i=5
until ((i==0))
do
	((i--))
	echo "i=$i"
done

输出:

i=4
i=3
i=2
i=1
i=0

跳出循环

shell中也支持break跳出循环, continue跳出本次循环.用法与C, Java中相同

函数

要定义一个函数, 可以使用下面两种形式:

function funcname()
{
	do something
}

或者

funcname ()
{
	do something
}

看个例子

#! /bin/sh
# ad.sh 计算sum
add()
{
	let "sum=$1+$2"
	return $sum
}
 
add $1 $2
echo "sum=$?"

输入

ad 1 2

输出

sum=3

其中, $?在shell中保存的是上一条命令的返回值

NOTE:

  1. 函数必须先定义后使用
  2. 如果在函数中使用exit会退出脚本, 如果想退回到原本函数调用的地方, 则可使用return

向脚本传递参数

先shell脚本传递参数, 非常简单, 只需要在你执行命令的后面跟上即可, 看个例子:

#! /bin/sh
# test.sh
echo "$# parameters";
echo "$@";
echo "$0"
echo "$1"

输入:

test.sh 11 22

输出:

2 parameters
11 22
test.sh
11

后记

之所以要写这篇博客, 有以下几个原因:

  1. 想总结一下shell编程中的关键知识点, 方便日后查看.
  2. 想通过shell优化一下我的hexo写作及博客管理流程, 目前相关脚本已完成, 待我下一篇博客分享给大家, 如果你也是在用Hexo写博客, 相信对你会很有用, 尽请期待! 已经发布
  3. 可以看的出这里总结的都是最关键的知识点, 还有很多这里并没有说. 是因为我觉得刚开始学习一个东西没必要太计较一些细节/琐碎的东西, 掌握好大致知识框架, 然后在大家编写具体的脚本时, 遇到具体问题, 再去google寻找即可.

参考

  1. Shell脚本编程30分钟入门
  2. Linux Shell编程从入门到精通

from:http://ghui.me/post/2016/06/shell-handbook/

 

Linux Shell 文本处理工具集锦

本文将介绍Linux下使用Shell处理文本时最常用的工具:

find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk;

提供的例子和参数都是最常用和最为实用的;

我对shell脚本使用的原则是命令单行书写,尽量不要超过2行;

如果有更为复杂的任务需求,还是考虑python吧;

find 文件查找

  • 查找txt和pdf文件
      find . ( -name "*.txt" -o -name "*.pdf" ) -print
  • 正则方式查找.txt和pdf
      find . -regex  ".*(.txt|.pdf)$"

    -iregex: 忽略大小写的正则

  • 否定参数查找所有非txt文本
       find . ! -name "*.txt" -print
  • 指定搜索深度打印出当前目录的文件(深度为1)
      find . -maxdepth 1 -type f

定制搜索

  • 按类型搜索:
      find . -type d -print  //只列出所有目录

    -type f 文件 / l 符号链接

  • 按时间搜索:-atime 访问时间 (单位是天,分钟单位则是-amin,以下类似)-mtime 修改时间 (内容被修改)-ctime 变化时间 (元数据或权限变化)最近7天被访问过的所有文件:
      find . -atime 7 -type f -print
  • 按大小搜索:w字 k M G寻找大于2k的文件
      find . -type f -size +2k

    按权限查找:

      find . -type f -perm 644 -print //找具有可执行权限的所有文件

    按用户查找:

      find . -type f -user weber -print// 找用户weber所拥有的文件

找到后的后续动作

  • 删除:删除当前目录下所有的swp文件:
      find . -type f -name "*.swp" -delete
  • 执行动作(强大的exec)
      find . -type f -user root -exec chown weber {} ; //将当前目录下的所有权变更为weber

    注:{}是一个特殊的字符串,对于每一个匹配的文件,{}会被替换成相应的文件名;

    eg:将找到的文件全都copy到另一个目录:

      find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD ;
  • 结合多个命令tips: 如果需要后续执行多个命令,可以将多个命令写成一个脚本。然后 -exec 调用时执行脚本即可;
      -exec ./commands.sh {} \;

-print的定界符

默认使用’n’作为文件的定界符;

-print0 使用”作为文件的定界符,这样就可以搜索包含空格的文件;

grep 文本搜索

grep match_patten file // 默认访问匹配行

  • 常用参数-o 只输出匹配的文本行 VS -v 只输出没有匹配的文本行-c 统计文件中包含文本的次数
      grep -c "text" filename

    -n 打印匹配的行号

    -i 搜索时忽略大小写

    -l 只打印文件名

  • 在多级目录中对文本递归搜索(程序员搜代码的最爱):
      grep "class" . -R -n
  • 匹配多个模式
      grep -e "class" -e "vitural" file
  • grep输出以作为结尾符的文件名:(-z)
      grep "test" file* -lZ| xargs -0 rm

xargs 命令行参数转换

xargs 能够将输入数据转化为特定命令的命令行参数;这样,可以配合很多命令来组合使用。比如grep,比如find;

  • 将多行输出转化为单行输出cat file.txt| xargsn 是多行文本间的定界符
  • 将单行转化为多行输出cat single.txt | xargs -n 3-n:指定每行显示的字段数

xargs参数说明

-d 定义定界符 (默认为空格 多行的定界符为 n)

-n 指定输出为多行

-I {} 指定替换字符串,这个字符串在xargs扩展时会被替换掉,用于待执行的命令需要多个参数时

eg:

cat file.txt | xargs -I {} ./command.sh -p {} -1

-0:指定为输入定界符

eg:统计程序行数

find source_dir/ -type f -name "*.cpp" -print0 |xargs -0 wc -l

sort 排序

字段说明:

-n 按数字进行排序 VS -d 按字典序进行排序

-r 逆序排序

-k N 指定按第N列排序

eg:

sort -nrk 1 data.txt
sort -bd data // 忽略像空格之类的前导空白字符

uniq 消除重复行

  • 消除重复行
      sort unsort.txt | uniq
  • 统计各行在文件中出现的次数
      sort unsort.txt | uniq -c
  • 找出重复行
      sort unsort.txt | uniq -d

    可指定每行中需要比较的重复内容:-s 开始位置 -w 比较字符数

用tr进行转换

  • 通用用法
      echo 12345 | tr '0-9' '9876543210' //加解密转换,替换对应字符
      cat text| tr 't' ' '  //制表符转空格
  • tr删除字符
      cat file | tr -d '0-9' // 删除所有数字

    -c 求补集

      cat file | tr -c '0-9' //获取文件中所有数字
      cat file | tr -d -c '0-9 n'  //删除非数字数据
  • tr压缩字符tr -s 压缩文本中出现的重复字符;最常用于压缩多余的空格
      cat file | tr -s ' '
  • 字符类tr中可用各种字符类:alnum:字母和数字alpha:字母digit:数字

    space:空白字符

    lower:小写

    upper:大写

    cntrl:控制(非可打印)字符

    print:可打印字符

    使用方法:tr [:class:] [:class:]

      eg: tr '[:lower:]' '[:upper:]'

cut 按列切分文本

  • 截取文件的第2列和第4列:
      cut -f2,4 filename
  • 去文件除第3列的所有列:
      cut -f3 --complement filename
  • -d 指定定界符:
      cat -f2 -d";" filename
  • cut 取的范围N- 第N个字段到结尾-M 第1个字段为MN-M N到M个字段
  • cut 取的单位-b 以字节为单位-c 以字符为单位-f 以字段为单位(使用定界符)
  • eg:
      cut -c1-5 file //打印第一到5个字符
      cut -c-2 file  //打印前2个字符

paste 按列拼接文本

将两个文本按列拼接到一起;

cat file1
1
2

cat file2
colin
book

paste file1 file2
1 colin
2 book

默认的定界符是制表符,可以用-d指明定界符

paste file1 file2 -d “,”

1,colin

2,book

wc 统计行和字符的工具

wc -l file // 统计行数

wc -w file // 统计单词数

wc -c file // 统计字符数

sed 文本替换利器

  • 首处替换
      seg 's/text/replace_text/' file   //替换每一行的第一处匹配的text
  • 全局替换
       seg 's/text/replace_text/g' file

    默认替换后,输出替换后的内容,如果需要直接替换原文件,使用-i:

      seg -i 's/text/repalce_text/g' file
  • 移除空白行:
      sed '/^$/d' file
  • 变量转换已匹配的字符串通过标记&来引用.
    echo this is en example | seg 's/\w+/[&]/g'
    $>[this]  [is] [en] [example]
  • 子串匹配标记第一个匹配的括号内容使用标记 1 来引用
      sed 's/hello([0-9])/1/'
  • 双引号求值sed通常用单引号来引用;也可使用双引号,使用双引号后,双引号会对表达式求值:
      sed 's/$var/HLLOE/'

    当使用双引号时,我们可以在sed样式和替换字符串中指定变量;

    eg:
    p=patten
    r=replaced
    echo "line con a patten" | sed "s/$p/$r/g"
    $>line con a replaced
  • 其它示例字符串插入字符:将文本中每行内容(PEKSHA) 转换为 PEK/SHA
      sed 's/^.{3}/

awk 数据流处理工具

  • awk脚本结构awk ‘ BEGIN{ statements } statements2 END{ statements } ‘
  • 工作方式1.执行begin中语句块;2.从文件或stdin中读入一行,然后执行statements2,重复这个过程,直到文件全部被读取完毕;3.执行end语句块;

print 打印当前行

  • 使用不带参数的print时,会打印当前行;
      echo -e "line1nline2" | awk 'BEGIN{print "start"} {print } END{ print "End" }'
  • print 以逗号分割时,参数以空格定界;
    echo | awk ' {var1 = "v1" ; var2 = "V2"; var3="v3"; 
    print var1, var2 , var3; }'
    $>v1 V2 v3
  • 使用-拼接符的方式(””作为拼接符);
    echo | awk ' {var1 = "v1" ; var2 = "V2"; var3="v3"; 
    print var1"-"var2"-"var3; }'
    $>v1-V2-v3

特殊变量: NR NF $0 $1 $2

NR:表示记录数量,在执行过程中对应当前行号;

NF:表示字段数量,在执行过程总对应当前行的字段数;

$0:这个变量包含执行过程中当前行的文本内容;

$1:第一个字段的文本内容;

$2:第二个字段的文本内容;

echo -e "line1 f2 f3n line2 n line 3" | awk '{print NR":"$0"-"$1"-"$2}'
  • 打印每一行的第二和第三个字段:
      awk '{print $2, $3}' file
  • 统计文件的行数:
      awk ' END {print NR}' file
  • 累加每一行的第一个字段:
      echo -e "1n 2n 3n 4n" | awk 'BEGIN{num = 0 ;
      print "begin";} {sum += $1;} END {print "=="; print sum }'

传递外部变量

var=1000
echo | awk '{print vara}' vara=$var #  输入来自stdin
awk '{print vara}' vara=$var file # 输入来自文件

用样式对awk处理的行进行过滤

awk ‘NR awk ‘NR==1,NR==4 {print}’ file #行号等于1和4的打印出来

awk ‘/linux/’ #包含linux文本的行(可以用正则表达式来指定,超级强大)

awk ‘!/linux/’ #不包含linux文本的行

设置定界符

使用-F来设置定界符(默认为空格)

awk -F: ‘{print $NF}’ /etc/passwd

读取命令输出

使用getline,将外部shell命令的输出读入到变量cmdout中;

echo | awk '{"grep root /etc/passwd" | getline cmdout; print cmdout }'

在awk中使用循环

for(i=0;ifor(i in array){print array[i];}

eg:

以逆序的形式打印行:(tac命令的实现)

seq 9| 
awk '{lifo[NR] = $0; lno=NR} 
END{ for(;lno>-1;lno--){print lifo[lno];}
} '

awk实现head、tail命令

  • head:
       awk 'NR<=10{print}' filename
  • tail:
      awk '{buffer[NR%10] = $0;} END{for(i=0;i<11;i++){ \
      print buffer[i %10]} } ' filename

打印指定列

  • awk方式实现:
      ls -lrt | awk '{print $6}'
  • cut方式实现
      ls -lrt | cut -f6

打印指定文本区域

  • 确定行号
      seq 100| awk 'NR==4,NR==6{print}'
  • 确定文本打印处于start_pattern 和end_pattern之间的文本;
      awk '/start_pattern/, /end_pattern/' filename

    eg:

    seq 100 | awk '/13/,/15/'
    cat /etc/passwd| awk '/mai.*mail/,/news.*news/'

awk常用内建函数

index(string,search_string):返回search_string在string中出现的位置

sub(regex,replacement_str,string):将正则匹配到的第一处内容替换为replacement_str;

match(regex,string):检查正则表达式是否能够匹配字符串;

length(string):返回字符串长度

echo | awk '{"grep root /etc/passwd" | getline cmdout; print length(cmdout) }'

printf 类似c语言中的printf,对输出进行格式化

eg:

seq 10 | awk '{printf "->%4sn", $1}'

迭代文件中的行、单词和字符

1. 迭代文件中的每一行

  • while 循环法
    while read line;
    do
    echo $line;
    done < file.txt
    改成子shell:
    cat file.txt | (while read line;do echo $line;done)
  • awk法:cat file.txt| awk ‘{print}’

2.迭代一行中的每一个单词

for word in $line;
do 
echo $word;
done

3. 迭代每一个字符

${string:start_pos:num_of_chars}:从字符串中提取一个字符;(bash文本切片)

${#word}:返回变量word的长度

for((i=0;i<${#word};i++))
do
echo ${word:i:1);
done
from:http://www.cnblogs.com/me115/p/3427319.html

Linux下设置tomcat自启动

usr/lib/systemd/system

在当前目录下创建worker.service文件,内容如下:

[Unit]
Description=CPUS Transfer Worker
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/root/bin/Transwork/startAll.sh

[Install]
WantedBy=multi-user.target
~
tomcat.service

[Unit]
Description=Tomcat
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/usr/share/apache-tomcat-8.0.9/bin/startup.sh
ExecStop=/usr/share/apache-tomcat-8.0.9/bin/shutdown.sh

[Install]
WantedBy=multi-user.target
~
~
~
~
Refer:
CentOS7 增加tomcat 启动,停止,使用systemctl进行配置http://www.itnose.net/detail/6163208.html

Other:
查看全部服务命令:
systemctl list-unit-files –type service
查看服务
systemctl status name.service
启动服务
systemctl start name.service
停止服务
systemctl stop name.service
重启服务
systemctl restart name.service增加开机启动
systemctl enable name.service
删除开机启动
systemctl disable name.service
其中.service 可以省略。