tar命令

tar

tar命令可用于创建、解压缩、不解压直接查看 压缩文件,删除压缩文件里的指定文件。支持的格式有gzip、bzip2、compress。

常用选项

  • -c, --create:创建新的压缩文件。
  • -x, --extract, --get:解压缩文件。
  • -C, --firectory dir:转到指定目录,与-x选项合用可直接解压到指定目录。
  • -t, --list:列出压缩文件中的文件列表。
  • -f filename, --file filename:指定压缩文件的文件名。
  • -z, --gzip, --ungzip:使用gzip格式对文件进行压缩或解压缩。
  • -j, --bzip2, --bunzip2:使用bzip2格式对文件进行压缩或解压缩。
  • -Z, --compress, --bucompress:使用compress格式对文件进行压缩或解压缩。
  • -v, --verbose:详细显示处理的文件。
  • --exclude file:排除指定的文件。
  • -X, --exclude-from filename:从filename中读入不想包含的文件列表。
  • --remove-files:建立压缩文件后删除源文件。
  • -r, --append:附加到压缩文件。
  • -P, --absolute-paths:不要从文件名中去除’/’,即允许使用绝对路径。

举例

tar cf test.tgz *.sh:用gzip创建压缩文件。

tar tf test.tgz:查看压缩文件里的文件列表。

tar xf test.tgz:解压缩test.tgz文件。

tar xf test.tgz -C scripts:解压缩test.tgz文件到scripts目录。

tar rf test.tgz * setup.sh_bak:把setup.sh_bak追加压缩进现有的test.tgz文件里。

tar f test.tgz --delete setup.sh_bak:删除压缩文件test.tgz里的setup.sh_bak文件。

tar cf test.tgz *.sh --exclude test.sh:用gzip创建压缩文件,不压缩test.sh文件。

tar tf test.tgz --exclude test.sh:查看压缩文件里的文件列表,不列出test.sh文件。


欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。

shell 脚本之条件测试和流程结构

条件测试

每个命令结束后,都有返回一个结束状态值,值为0表示执行成功,非0表示失败。条件测试就是以状态返回值的真假值作为判断依据:值为0判断为真,非0判断为假。

条件测试的写法

  • 执行一个命令,可以包括管道命令。例如:

if  grep  -q  "rm"  fn.sh;  then
     echo "find rm command."
else
     echo  "not found ."
fi
  • 传回某一命令执行结果的相反值:! command!与命令之间用空格分开。

if  !  grep  -q  "rm"  fn.sh;  then
     echo  "not found ."
else
     echo "find rm command."
fi
  • 使用符合命令:(( expression ))。如果expression的值不为0,则传回真值(0),否则传回假值(1)。
  • 使用Bash关键字[[]]组成的式子:[[ 判断式 ]]注意:[[ 的后面、]]的前面都要有空格。


if  [[ str > xyz ]];  then
     echo "str bigger than  xyz."
else
     echo "str not bigger than  xyz."
fi
  • 使用内置命令test: test 判断式

if  test "str" \> "xyz";  then
     echo "str bigger than  xyz."
else
     echo "str not bigger than  xyz."
fi
  • 使用内置命令:[][]test的用法是相同的,可以互换。注意:[ 的后面、]的前面都要有空格。

if  [ "str" \> "xyz" ];  then
     echo "str bigger than  xyz."
else
     echo "str not bigger than  xyz."
fi
  • 使用-a, -o进行逻辑组合。-a是逻辑与,-o逻辑或。例如:[ -f filename -a -x filename ],如果filename可读且可执行则为真。

  • 注意:

    • test[]都需要对Bash特殊字符进行转义;而[[]]不需要,<, >, &&, ||都可以在其中自由使用。
    • [[ 判断式 ]]中,如果使用==, !=,且在这两个运算符右边的字符串没有加上单引号或双引号,则==, !=会视为需要匹配该字符串所形成的“样式”,如果匹配,返回0,否则返回1。
    • [[ 判断式 ]]中,=~的右边放置要匹配的样式。样式不能用引号引起,否则不会被当作样式匹配。

继续阅读

shell 脚本之变量、数组、扩展

变量

变量是什么

在Bash shell中,只有一种数据型态:以字符组成的字符串。Bash Shell把任何存储在变量中的值,皆视为以字符组成的“字符串”。
要使用Bash Shell变量,不需要经过实现声明。

每个Shell环境都会维护一份它们自己的变量空间,彼此不互相影响。

变量命名

变量名可用英文字母、数字及下划线组成,但开头第一个字符不能是数字;变量名长度不限制;大小写敏感;

变量赋值

给变量赋值时,等号两边不可以有空白;若变量值有空白,则要用引号括起来。

变量和引号

推荐习惯:把字符串用双引号或单引号括起来。
在双引号中,可进行以下3个操作:替换变量;替换命令执行结果;替换算术运算结果。

单引号的作用是形成一个所见即所得的字符串,不会进行任何变量替换的操作。

取变量值

$变量名${变量名}
前者在变量名后面是空白符时使用,后者在变量名与其他字母、数字、下划线混合时使用。

取消变量:

取消变量就是把变量从变量空间删除释放。


unset 变量名
unset -v 变量名
unset -f 函数名

清空变量

变量仍然存在,只不过值是长度为0的字符串。

变量名=

继续阅读

grep 命令

grep是一个最初用于Unix操作系统的命令行工具。在给出文件列表或标准输入后,grep会对匹配一个或多个正则表达式的文本进行搜索,并只输出匹配(或者不匹配)的行或文本。

egrep是grep的扩充版本,改良了grep不能或不方便的操作,主要是正则匹配方面的扩展。

fgrep不做正则处理,表达式仅作为一般字符串处理,所有正则元字符不起作用。

调用grep

一般的grep命令行是:grep options pattern input_file_names

可以有零个或多个options和input_file_names,可以用-e pattern-f file选项来指定多个正则表达式。

grep 常用选项

  • -v:逆反模式,只输出不匹配的行。
  • -r:递归搜索目录。
  • -q:静默模式,不输出任何结果(stderr除外,用于获取命令返回值,有匹配为true,否则为false)。
  • -i:忽略大小写区别。
  • -w:整个单词匹配。
  • -n:同时输出行号。
  • -c:只输出匹配的行数。
  • -l:只输出含有匹配行的文件名。
  • -E:切换到egrep。

举例

grep -l 'main' *.c:在当前目录下的所有c源文件里搜索含有main的文件,只输出文件名。

grep -r 'hello' /home/gigi:递归地搜索目录。

find /home/gigi -name "*.c" -print0 | xargs -0r grep -H 'hello':在/home/gigi目录下的所有c文件里搜索hello,类似于:grep -rH --include='*.c' 'hello' /home/gigi

grep -e '--cut here--' *:如果模式以-开头,需要使用-e选项,否则grep是尝试当作选项列表来解析。

grep -w 'hello' *:搜索一个完整的单词,而不是作为单词的一部分。

grep -C 2 'hello' *:输出匹配行的上下文,前后各2行。

grep -H 'eli' /etc/passwd /dev/null:强制grep输出匹配行所在的文件名。

ps -ef | grep '[c]ron:这里之所以要使用字符集[]模式,是为了避免匹配到这条命令本身。

grep 'paul' /etc/motd | grep 'franc,ois':grep没法表示一个逻辑与的概念,如果需要同时匹配多个模式,需要使用多个grep命令。

cat /etc/passwd | grep 'alain' - /etc/motd:同时在标准输入和输入文件里查找。-表示标准输入。

echo -e "123321\nabcxyz\nabcba" | grep -e '\(.\)\(.\).\2\1':用正则表达式表示回文。能够匹配的回文多达19个字符:
echo "1234567890987654321" | grep -E -e '^(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?).?\9\8\7\6\5\4\3\2\1$'

继续阅读

cut,sort,uniq,du 命令

cut

从文件的每一行抽出一部分。

常用选项:

  • -d 指定分隔符,如: -d: 指定冒号为分隔符。
  • -f 指定要抽取的字段,可以用逗号分隔要选取的字段,也可以用-指定要选取的字段范围,如: -f1,2抽取第1、2个字段, -f1-3抽取第[1-3]的字段。
  • -c 抽取指定范围的字符,包含起始位置,如: -c9-抽取第9个及以后的的字符, -c1-3,22-抽取第1-3以及第22及个以后的字符。

举例:

  • cut -d: -f1,6 /etc/passwd
  • cut -c2- /etc/passwd
  • cut -c1-5,22- /etc/passwd

sort

对文本文件的每一行进行排序,默认按ASCII的字符升序排序。

常用选项:

  • -f 把小写字母转换为大写字母来比较。
  • -i 忽略非字母。
  • -h 人类可读数字排序,如:3k < 2M < 1G
  • -n 按数字排序。
  • -r 降序排序。
  • -R 随机排序。
  • -k 按指定字段排序,如 -k 2 表示按第二个字段排序。

uniq

对已排序好的文件删除重复行或统计重复次数。

常用选项:

  • -d 只输出重复行。
  • -c 计算每一行重复的次数。输出结果是两列: 重复次数 行内容

举例:

  • echo -e "1\n1\n1\n2\nx\ny" | uniq -d 只会输出: 1

  • echo -e "1\n1\n1\n2\nx\ny" | uniq -c, 输出结果如下:


      3 1
      1 2
      1 x
      1 y

du

du 命令用于查看目录下文件及文件夹的大小(粗略,非精确, estimate)。

有用的选项:

  • -h 以人类可读的单位显示大小,如1.1K, 1.2M, 1.3G。
  • -s 为每个参数显示一个总和。如: du -s * 则显示当前目录下文件及直接子目录的大小。
  • -b -k -m 分别表示以 B KB MB 为单位。
  • –exclude=pattern 排除匹配模式pattern的文件。
  • –time 显示文件或目录的最后修改时间。

举例:

du -sh * 命令的输出虽然是可读的,但却没有排序,下面两个脚本是按大小排序的可读格式输出:

  • for x in K M G; do du -sh * | grep -P “^[1-9]+\.?[0-9]*$x” | sort -n; done
  • du -sh * | sort -h

欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。

xargs 命令

xargs的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题,其作用一般等同于shell中反引号,但更加灵活,并可以正确处理输入中的空格等特殊字符的情况。

命令的一般形式:xargs [option...] [command [initial-arguments]]

选项

  • -a inputfile--arg-file=inputfile,从inputfile读取名字而不是标准输入。如果使用了这个选项,标准输入流在命令执行时将保持不变,否则stdin从重定向自/dev/null
  • -0--null,(-0是数字0)输入文件名将以null字符而不是空白符结束,任何引号和反斜杠将不被特殊处理(每个字符取字面义)。Disables the end of file string, which is treated like any other argument.

  • -d delim--delimiter delim,输入文件名以指定的字符而不是空白符结束,任何引号和反斜杠将不被特殊处理(每个字符取字面义)。Disables the end of file string, which is treated like any other argument。一般是单个字符,不支持多字节字符。

  • -I replace-str-i[replace-str]--replace[=replace-str],用stdin读取的名字替换初始参数中出现的replace-strreplace-str默认是{}

  • -r--no-run-if-empty,如果标准输入是空的,不执行命令。默认情况下,命令至少执行一次,即使没有输入。

  • -t--verbose,在stderr上输出命令,在命令执行前。

  • -p,在命令执行前让用户确认是否执行。

  • -P max-procs--max-procs=max-procs,任意时刻,同时执行命令的最大进程数。默认是1。如果是0,xargs将同时运行尽可能多的进程。

  • L max-lines-l[max-lines]--max-lines[=max-lines],每个命令行最多处理max-lines个非空白输入行。

  • -n max-args--max-args=max-args,每个命令行最多使用max-args个参数。

  • -s max-chars--max-chars=max-chars,每个命令行最多使用max-chars个字符,包括命令、初始化参数和参数字符串的结束符。

  • -x--exit,如果超出了-s选项指定的大小将退出。

  • --process-slot-var=environment-variable-name
    继续阅读

linux find 命令

find 命令的一般形式: find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]

其中[-H] [-L] [-P] [-D debugopts] [-Olevel]并不常用,path是find命令所查找的目录路径,默认是当前目录,可以指定多个搜索目录,expression可以分为:-options [-opertaions ...]

find命令还支持-a, -o, \( exp \) 来组合选项,-a, -o分别表示逻辑与和逻辑或,\( exp \)用于指定优先级。默认情况下,各个选项之间的bool值是逻辑与的关系。

-opertaions选项详解

  • -print,每个结果文件名单独一行输出到标准输出。默认操作。
  • -fprint outfile,与-print一样,只是将结果输出到outfile。

  • -exec cmd,find命令将对匹配的文件执行该参数所给出的shell命令。一般模式为:'cmd' {} \;{}表示匹配的结果,即文件名,{}之间不能有空格;\;是必须的,表示命令的结束;{}\;之间有空格。例如: find ./ -size 0 -exec rm {} \; 删除大小为0的文件。

  • -ok cmd,同-exec一样,但是先询问用户(在标准输入),假如应答不是以yY开头,将不执行command,返回假。

  • -ls,将搜索到的结果用ls -l命令形式的结果输出到标准输出。

  • -fls outfile,同-ls选项一样输出,只是结果输出到outfile。

  • -print0,在标准输出上输出整个文件名,并后加一个空字符。则允许其他程序能正确处理在find输出中包含新行的文件名。

  • -fprint0 outfile,与-print0一样,只是输出到outfile。

  • -printf format,格式化输出到标准输出。

继续阅读

crontab调度

调度的基本格式


*    *     *    *     *       cmd
分  时    日   月    周      命令

第1列表示分钟  0 - 59,每分钟用 * 或者 */1表示。
第2列表示小时  0 - 23,0表示0点。
第3列表示日期 1 - 31
第4列表示月份  1 - 12
第5列表示星期 0 - 6, 0表示星期日
第6列是要运行的命令

月和周的属性值还可以用相应英语单词的前3个字母来表示,如jan表示一月,mon-wen表示周一到周三。

特殊符号:

  • 逗号,来分隔多个时间值,
  • - 表示一个时间范围,
  • *表示该属性的所有取值,是否有效取决于相关属性的值。
  • /n代表每隔n个时间单位的意思,*/5表示每隔5个单位,1-10/2表示1至10之间每隔2个时间单位,也就是1,3,5,7。
  • 如果时属性指定了具体值,而分属性是*则表示整点。

注意:因为日期属性与周属性都表示某一天,两者之间的关系是比较微妙的。

  • 如果两个属性都是*,当然是按每天调度。
  • 如果两个属性中有一个是具体的,如0-3,另一个是*,则按具体的属性调度,*不再表示所有取值。
  • 如果两个属性都是具体值,则按两个规则调度,都有效。

继续阅读

awk 学习笔记

awk分别代表其作者姓氏的第一个字母。

awk 基础

awk语法有两种形式:
awk [-F ERE] [-v assignment] 'program' [argument ...]
awk [-F ERE] -f progfile ... [-v assignment] ...[argument ...]

注意:第一种形式的 命令(program) 必须是用单引号引起。 awk -v a='a b c' 'BEGIN {print a; a=123} END{print a}'

标准的awk命令行参数主要由以下三个:

  • -F ERE:定义字段分隔符,该选项的值可以是一个字符串或扩展的正则表达式(ERE),如: -F: 表示以冒号分隔字段。
  • -f progfile:指定awk脚本,可以同时指定多个脚本,它们会按照在命令行中出现的顺序连接在一起。
  • -v assignment:定义awk变量,形式同awk中的变量赋值,即name=value,赋值发生在awk处理文本之前。

awk是一种编程语言,逐行扫描文件,寻找匹配特定模式的行,并在这些行上执行操作。
awk可以同时指定多个输入文件,如果输入文件的文件名为-,表示从标准输入读取内容。

Awk的输入被解析成多个记录(Record),默认情况下,记录的分隔符是 \n,因此可以认为一行就是一个记录,记录的分隔符可以通过内置变量RS更改。当记录匹配某个pattern时,才会执行后续的action命令。

而每个记录又进一步地被分隔成多个字段(Field),默认情况下字段的分隔符是空白符,例如空格、制表符等等,也可以通过-F ERE选项或者内置变量FS更改。在awk中,可以通过 $1,$2… 来访问对应位置的字段,同时 $0 存放整个记录,这一点有点类似shell下的命令行位置参数。

继续阅读