第一节:基础

ls -lh  ——可以用户友好的方式看到文件大小

file 文件名 ——查看文件类型

stat 文件名 ——查看文件当前状态

man 命令/函数名 ——查看详细的帮助文档

man中看某一命令选项的定位技巧  —— 输入/ -n -n前面要有一定的空格

#!/bin/bash

echo “Hello World!”

chmod 777 hello.sh或chmod a+x hello.sh等

./hello.sh执行

echo -e选项用来增强,支持转义字符。

var=world

echo “hello $var \n” ——输出hello world \n

echo -e “hello $var \n” ——输出hello world后有换行

echo -e "\033[32;40mHELLO YOU \033[0m"

——输出不同颜色的字体,以\033[开头,

——\033[0m结尾,3x是前景色,4x是背景色

第二节:变量

set/declare ——查看环境变量

env ——查看环境变量

两者是有区别的,set/declare显示所有的本地变量,env是获取环境变量

unset 变量名 ——取消变量

shell中所有变量都是字符串,变量区分大小写,如foo和Foo是不同的变量;

变量必须以字母或下划线开头;

变量名和值之间没有空格:MSG=Hello √  MSG=  Hello×

只读变量用readonly: readonly MSG=12   MSG=13×

变量引用:echo $var / echo ${var} 后者更加严格

修改环境变量:PATH=$PATH:/bin/opt

永久修改环境变量:vim ~/.bashrc;export PATH=${PATH}:/bin/opt ;source .bashrc

补充:

/etc/profile:

此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.
并从/etc/profile.d目录的配置文件中搜集shell的设置.

/etc/bashrc:

为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.

~/.bash_profile:

每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该
文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.

~/.bashrc:

该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该
该文件被读取.

~/.bash_logout:

当每次退出系统(退出bash shell)时,执行该文件. 
另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系.

注意他们之间有执行的优先级;

第三节:重定向

输出重定向

ls -l > dat.txt ——重定向到文件,会创建新文件

ls -l >> dat.txt ——追加到文件末尾

ls -l > /dev/null ——空洞文件

ls xxx > txt  ——文件不存在,则无法重定位,会输出错误信息

ls xxx > txt 2>&1 ——成功,1代表标准输出,2>&1表示2等同于1

输入重定向

cat >> dat.txt <<R   ——表示以R结束!(输入想要的数据后输入R结束)

read var <dat.txt ——将dat.txt中的第一行作为值付给变量var

管道

du -ah | sort -n ——列出一个目录的所有文件,按文件大小排序

ps aux | grep MySQL ——查看服务

rpm -qa | grep vsftpd ——查看软件是否已经安装可以使用这个方法

第四节:数学运算

(expr   ()   let)

expr 1 + 2 ——注意要有空格 expr格式要求较高

var=$(expr 1 \* 8) ——*要用转义

TMP=$((1+2)) ——直接使用() 不用空格

let var=3*8

echo $var

计划任务crontab -e进入编辑

第五节:引用

1.双引号:使用双引号可以输出除$、`、\ 以外的任意字符

echo “$hello world” ——输出 world

2.单引号:使用单引号会忽略任何的引用值

hello=10   echo ‘$hello’——输出$hello

3.反引号:用于将系统命令输出到变量

echo `ls` ——相当于执行ls命令

echo “`ls` Hello world” ——执行ls命令后继续打印hello world

4.反斜线:防止shell误解特殊含义的字符

如&  *  +  |  ?   $等等

第六节:grep和正则表达式

1.grep常用 grep -n(显示行号)  -r(递归)   -v(取反)  --color  --include等选项。

grep -nr “Hello” /home /var --include=*.c

2.正则表达式

元字符:[ ]  \  ^  $  . ?  |  *  +  (  )

^  ——匹配行首 ls | grep ^[0-9]以0-9开头的;  ls |grep ^[^A]以非A开头的

$  ——匹配行尾 ls | grep c$以c结尾的, 还可以使用’ ’  ls |grep ‘^[m]c$’

*  ——匹配0次或多次

?  ——匹配0次或1次

.  ——匹配任意单字符

partten\{n\}    ——匹配前面partten出现次数 n为次数

grep --color '^[0-9]\{3\}' txt

partten\{n,\}    ——匹配前面partten出现次数 n为至少出现次数

grep --color '^[0-9]\{1,\}' txt

partten\{n,m\}  ——匹配前面partten出现次数 出现次数为n-m之间

grep --color '^[0-9]\{1,3\}' txt

3.匹配开头和结尾字符

grep ‘^[hello]’ txt ——以hello开头,或grep ‘^hello’ txt

grep ‘hello$’ txt ——以hello结尾的单词

grep ‘^\bHello\b’ txt ——匹配整个单词Hello

第七节:sed命令

-n -p选项

sed  ‘p’ filename  ——查看文件内容 p代表print 注意:会显示两行

sed -n ‘p’ filename ——加上-n 表示只输出模式空间的内容

sed -n ‘1 p’ filename  ——只打印第一行 2 p打印前两行

sed -n ‘1,3 p’ filename  ——打印1-3行

sed -n ‘/main/ p’ file ——打印含有main的行

sed -n ‘/^main/ p’ file ——打印以main开头的行

sed -n ‘/main$/ p’ file ——打印以main结尾的行

sed -n ‘/^[0-9]/\{3\} p’ file——以数字开头 并出现三次

-d选项(delete),与p用法类似:

sed ‘1,3 d’ file ——删除1-3行

-f选项:从文件中读入命令 建立文件cmd.sed 如内容:/main/ p

sed -f cmd.sed  filename

-e选项:后面可以接多个命令

sed -n ‘/main/ p’ -e ‘/hello/ p’  filename

-i重要!

-i选项,会直接操作到文件内容

-s替换:

sed ‘1 s/main/hello/’ filename ——把第一行中main换成hello

sed ‘/main/ s/he/llo/’ filename ——把main所在字符串所在中he换成llo

sed ‘2  /main/ s/he/llo/’ filename ——把第二行且含有main的行中he换成llo

如果没有address-range和partten-range,就会操作到所有行,如

sed  ‘s/main/hello/’ filename ——把所有行中的main换成hello

substitute-flags:

g(global):全局开关   sed  ‘s/main/hello/g’ filename

数字:把每一行第n个符合条件的替换 sed  ‘s/main/hello/2’ filename

第二个出现的main

p:打印,不多说

w(write):输出到文件 sed ‘ s/main/hello/w out.txt’ filename

i(ignore):忽略大小写

各种标记可以联合使用:

sed ‘s/main/fuck/gipw 2.txt’  filename

&:

sed ‘s/main/[&]/’ filename 把每一行main换为[main]

实例:ll > txt

txt中内容如下:

总用量 32

drwxrwxr-x.  7 xxx xxx 4096 10月 18 20:19 install

-rw-rw-r--.  1 xxx xxx 0 12月 18 21:12 txt

drwxr-xr-x.  9 xxx xxx 4096  9月  5 17:22 vim

drwxrwxr-x.  9 xxx xxx 4096 12月 15 21:48 work

我只想要得到txt那一行的21:12

怎么做?

答案:

cat txt | grep txt | sed 's/.*..:...*/\1/g'

又如echo "hello my world" | sed 's/.*my.*/[\1]/'这样输出:[my]

第八节.AWK命令

awk命令

比较好的参考资料:

http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html

格式1:awk -Fs ‘BEGIN{ } / parten/ {action} END{ }’

action中的内容会循环执行 begin与end的内容只会执行一次

awk -F, ‘print $1,$2,$3’ txt ——按逗号分隔成每一个段 打印每一个段

加逗号会输出空格 以方便我们观察

awk -F, ‘print $1 $2 $3’ txt ——这样的会打印出来的没有逗号分隔

也可以不加逗号,加| 、 制表符等等,如下:

awk -F, ‘print $1”|”$2”|”$3’ txt

awk -F, ‘print $1”\t”$2 “\t”$3’ txt

awk -F, ‘/main/ print $1,$2,$3’ txt——匹配含有main的行

awk -F. '/txt/ {print $1 "\t" $2}' txt——以.作为分隔符。。。

内置变量:

FS内置变量 代表分隔符 OFS代表输出分隔符

awk 'BEGIN{FS=","; OFS="\t"; printf("===================\n")} {print $1,$2, $3} END{print("===================")}' txt

可以指定多个分隔符,如 .  :  %三个

awk 'BEGIN{FS=[.:%]; OFS="\t"; printf("===================\n")} {print $1,$2, $3} END{print("===================")}' txt

指定分隔符并换行RS

文件内容:

101

lvy

BOSS

-

102

XXX

XXX

-

103

QQQ

QQQ

-

要求得到格式如:

lvy:BOSS

XXX:XXX

QQQ:QQQ

答案:

awk 'BEGIN{FS="\n"; OFS=":"; RS="-\n"} {print $2,$3} END{}' txt

输出分隔符ORS

awk 'BEGIN{FS="\n"; OFS=":"; RS="-\n"; ORS="\n----------\n"} {print $2,$3} END{}' txt

用在在每一行执行完毕后输出一些内容。。。

lvy:BOSS

----------

XXX:XXX

----------

QQQ:QQQ

----------

awk中print与printf

print中不需要对变量进行处理,如果是字符串 加双引号

printf与C语言中的用法是一样的。

复习AWK:

awk '{print $0}' txt ——打印txt中所有行

awk 'BEGIN{OFS=":";RS="-\n"} {print $2,$3}' txt

默认的域分隔符是空格  域分隔符使用-F指定

sudo cat /etc/passwd | awk -F: '{print $1}' ——冒号作为域分隔符

对比sudo cat /etc/passwd | awk '{print $1}'看看

统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:

awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd

awk 'BEGIN{print("Hello"); FS=".";} {print FILENAME, NR, $2} END{print("World!")}' txt

FILENAME代表文件名;NR代表行号;NF代表列数 $NF可以取最后列

自定义变量:

必须以字符开始,不能使用内置变量,最好放在begin段中

awk  -f  xxx.awk  file ——  -f选项指定可以在后面接一个awk脚本。

必须是下面这种形式 BEGIN{要放在一行

BEGIN{

total=0;

}

{

total += 1;

}

END{

print “total is :”, total;

}

一元运算符:+返回数字本身  - 改变数字的符号   ++递增操作

算术运算符:+ - * /

字符串连接:str = str1”__”str2; 可以连接

比较/逻辑运算符:>  >=  <  <=  &&  || 等

正则表达式:~匹配   !~不匹配

实例:统计/etc/passwd下有多少用户使用/bin/bash

cat /etc/passwd | awk -F: 'BEGIN{NUM=0;} /\/bin\/bash/ {print $NF; NUM++;} END{print "The number who use /bin/bash is:", NUM}'

AWK条件与循环:

与c语言一样,awk中也有条件、循环语句

例子:awk -F, ‘{if ($3 == 500) print $1; else print “Not Found!”;}’ /etc/passwd

第九节.shell环境

变量别名:shell中输入alias ll=”ls -l”

如果想退出终端后还有效的话 就写入~/.bashrc

stty -echo ——设置输出不回显 可以再输入密码时,设置。

stty echo  ——回显

cal ——查看日历

cal [[day][month]year]  [代表是可选的]  cal 7 2014表示查看2014年7月份

data ——查看时间

date “+%A” 查看星期几

date "+%Y-%m-%d %H:%M:%S" ——显示2014-12-26 21:06:29

find命令补充:find [option] [-exec | -ok] command {} \;

-exec、-ok选项  -exec是不安全的,-ok是安全的

find /home -name test.txt -exec rm {} \; ——找到后会立刻删除,不会提示

find . -name aaa -ok rm {} \; ——会提示是否删除

find . -name aaa -exec cp {} /home \;

-xargs选项

find . -name aaa | xargs rm

find . -name aaa | xargs -i mv {} /opt

实例:查找当前目录下非.c的文件 并进行删除:

find . -type f ! -name *.c | xargs rm -f  ——注意感叹号的位置

第十节.shell脚本编程

shell条件语句:

if list then 
          do something here 
      elif list then 
          do another thing here 
      else 
         do something else here 
      fi

EX1:

#!/bin/sh

SYSTEM=`uname -s`        #获取操作系统类型

if [ $SYSTEM = "Linux" ] ; then     #如果是linux的话打印linux字符串 注意[]中两边的空格
echo "Linux" 
elif [ $SYSTEM = "FreeBSD" ] ; then   
echo "FreeBSD" 
elif [ $SYSTEM = "Solaris" ] ; then 
echo "Solaris" 
else 
echo "What?" 
fi     #ifend

基本上和其他脚本语言一样。没有太大区别。不过值得注意的是。[]里面的条件判断。

1 字符串判断

str1 = str2      当两个串有相同内容、长度时为真 
str1 != str2      当串str1和str2不等时为真 
-n str1        当串的长度大于0时为真(串非空) 
-z str1        当串的长度为0时为真(空串) 
str1           当串str1为非空时为真

2 数字的判断

int1 -eq int2    两数相等为真 
int1 -ne int2    两数不等为真 
int1 -gt int2    int1大于int2为真 
int1 -ge int2    int1大于等于int2为真 
int1 -lt int2    int1小于int2为真 
int1 -le int2    int1小于等于int2为真

3 文件的判断

-r file     用户可读为真 
-w file     用户可写为真 
-x file     用户可执行为真 
-f file     文件为正规文件为真 
-d file     文件为目录为真 
-c file     文件为字符特殊文件为真 
-b file     文件为块特殊文件为真 
-s file     文件大小非0时为真 
-t file     当文件描述符(默认为1)指定的设备为终端时为真

3 复杂逻辑判断

-a         与 
-o        或 
!        非

一些预定义的变量:

linux中shell变量$#,$@,$0,$1,$2的含义解释: 
$$    Shell本身的PID(ProcessID)

$!    Shell最后运行的后台Process的PID 
$?    最后运行的命令的结束代码(返回值) 
$-    使用Set命令设定的Flag一览 
$*    所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 
$@   所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 
$#   添加到Shell的参数个数 
$0   Shell本身的文件名 
$1~$n  添加到Shell的各参数值。$1是第1参数、$2是第2参数…。

补充:

filename1 -nt filename2 如果 filename1 比 filename2 新,则为真 [ /tmp/install/etc/services -nt /etc/services ]

filename1 -ot filename2 如果 filename1 比 filename2 旧,则为真 [ /boot/Image -ot arch/i386/boot/bzImage ]

转自:http://blog.csdn.net/scottly1/article/details/42197997

linux shell编程进阶学习(转)的更多相关文章

  1. 前端学习 linux —— shell 编程

    前端学习 linux - shell 编程 shell 原意是"外壳",与 kernel(内核)相对应,比喻内核外的一层,是用户和内核沟通的桥梁.shell 有很多种,国内通常使用 ...

  2. 详细介绍Linux shell脚本基础学习

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Lin ...

  3. linux shell编程总结

    linux shell编程总结 本周学习了unix/linux shell编程,参考的是<LINUX与UNIX Shell 编程指南>,David Tansley著:徐焱,张春萌等译,由机 ...

  4. Linux Shell编程与编辑器使用详解

    <Linux Shell编程与编辑器使用详解> 基本信息 作者: 刘丽霞 杨宇 出版社:电子工业出版社 ISBN:9787121207174 上架时间:2013-7-22 出版日期:201 ...

  5. Linux shell脚本基础学习详细介绍(完整版)二

    详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续 ...

  6. Linux shell脚本基础学习详细介绍(完整版)一

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Lin ...

  7. [Linux] Linux C编程一站式学习 Part.3

    Linux系统编程 文件与I/O C标准I/O库函数与Unbuffered I/O函数 C标准I/O库函数printf().putchar().fputs(),会在用户空间开辟I/O缓冲区 系统函数o ...

  8. linux —— shell 编程(文本处理)

    导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 基本文本处理 流编辑器sed aw ...

  9. linux —— shell 编程(编程语法)

    导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 再识变量 函数 条件语句 循环语句 ...

随机推荐

  1. SpringMvc @JsonView 使用方式

    准确来说,@JsonView注解不是Spring的,它位于jackson-annotation包中: 作用:SpringMvc使用@ResponseBody将结果以json返回客户端,  有些实体类的 ...

  2. ffplay源码分析1-概述

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10301215.html ffplay是一个很简单的播放器,但是初次接触仍会感到概念和细节 ...

  3. BFS算法(——模板习题与总结)

    首先需要说明的是BFS算法(广度优先算法)本质上也是枚举思想的一种体现,本身效率不是很高,当数据规模很小的时候还是可以一试的.其次很多人可能有这样的疑问,使用搜索算法的时候,到底选用DFS还是BFS, ...

  4. vue---数据更新,视图不更新问题

    写点赞功能时,点赞后已经追加到对象里了,但是视图没有更新. 查找了些资料: 数据已经更新了但是视图不更新的问题,有几个原因: 1.根属性不存在,而想要直接给根属性赋值导致的视图不更新.此时初始化属性的 ...

  5. 安装svn过程

    1.SVN服务器端程序安装 --检测是否安装成功:svn --version2.创建版本库(仓库) 命令格式:svnadmin create 仓库的目录 3.启动服务器 <1>命令行方式 ...

  6. 【ZeroMQ】1、ZeroMQ(java)入门之Requerst/Response模式

    自己最开始是在cloud foundry中接触过消息服务器(nats),或者说是消息中间件,也算是初步知道了一个消息服务器对于分布式的网络系统的重要性,后来自己也曾想过在一些项目中使用它,尤其是在一些 ...

  7. 撩课-Web大前端每天5道面试题-Day36

    1.介绍一下你对浏览器内核的理解? 主要分成两部分:渲染引擎(layout engineer或Rendering Engine)和JS引擎. 渲染引擎:负责取得网页的内容(HTML.XML.图像等等) ...

  8. python3爬虫(find_all用法等)

    #read1.html文件 # <html><head><title>The Dormouse's story</title></head> ...

  9. CF712E Memory and Casinos

    设\(f[i]\)为从\(i\)到\(r+1\)且不走出区间的概率 \(f[i]=p[i]f[i+1]+(1-p[i])f[i-1]\) \(f[i]-f[i-1]=p[i](f[i+1]-f[i-1 ...

  10. 【代码笔记】iOS-UITableView上的button点击事件

    代码. ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController < ...