命令alias、gerp、find及基础Shell脚本
一、 alias 命令:系统设置命令别名
用法:alias [-p] [name[=value] ... ] 注意‘=’和字符串之间不能包含空格
显示当前设置的别名:alias 或 alias –p
[root@localhost ~]# alias alias cp='cp -i' alias egrep='egrep --color=auto' alias fgrep='fgrep --color=auto' alias grep='grep --color=auto' alias l.='ls -d .* --color=auto' alias ll='ls -l --color=auto' alias ls='ls --color=auto' alias mv='mv -i' alias rm='rm -i' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' [root@localhost ~]# alias -p alias cp='cp -i' alias egrep='egrep --color=auto' alias fgrep='fgrep --color=auto' alias grep='grep --color=auto' alias l.='ls -d .* --color=auto' alias ll='ls -l --color=auto' alias ls='ls --color=auto' alias mv='mv -i' alias rm='rm -i' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
若只想显示某个别名代表的含义可输入alias name,比如:
[root@localhost ~]# alias ls alias ls='ls --color=auto'
若想为某个命令设置别名可输入 alias 新命令='原命令 选项/参数',比如:
[root@localhost ~]# alias lftps='lftp 172.168.0.1/pub' [root@localhost ~]# alias lftps alias lftps='lftp 172.168.0.1/pub'
别名永久化:
alias的作用仅在该次登入的操作,即输入一次alias后,这个修改只在当前的Shell生效。如果重新开启一个 Shell,或者重新登录,则这些alias将无法使用。好在linux中提供alias永久化的方法:
<1>.若要每次登入就自动生效别名,则把别名加在/etc/profile或~/.bashrc中。然后# source ~/.bashrc
[root@localhost ~]# cat .bashrc # .bashrc # User specific aliases and functions alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' alias lftps='172.168.0.1/pub' # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi [root@localhost ~]# source ~/.bashrc [root@localhost ~]# lftps -bash: 172.168.0.1/pub: No such file or directory
<2>.若要让每一位用户都生效别名,则把别名加在/etc/bashrc最后面,然后# source /etc/bashrc
若想取消某个别名可输入unalias name,比如
unalias lftps
二、文本处理工具grep:
Linux上文本处理三剑客:
grep, egrep, fgrep:文本过滤工具(模式:pattern)工具;
grep:基本正则表达式,-E,-F
egrep:扩展正则表达式, -G,-F
fgrep:不支持正则表达式,
sed:stream editor, 流编辑器;文本编辑工具;
awk:Linux上的实现为gawk,文本报告生成器(格式化文本);
概念:正则表达式(Regual Expression, REGEXP):由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能;
分类:正则表达式分两类:
基本正则表达式:BRE
扩展正则表达式:ERE
元字符:\(hello[[:space:]]\+\)\+
grep(Global search REgular expression and Print out the line):.
作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查;打印匹配到的行;
模式:由正则表达式的元字符及文本字符所编写出的过滤条件;
正则表达式引擎;
用法1:grep [OPTIONS] PATTERN
[FILE...]
实例:
[root@localhost ~]# grep "UID" /etc/fstab UUID=86f402f4-53d3-44d5-be0f-7b83897744d9 / ext4 defaults 1 1 UUID=50ad8124-e08c-4e0f-8788-6529804755f4 /boot ext4 defaults 1 2
用法2:grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
参数OPTIONS:
--color=auto:对匹配到的文本着色后高亮显示;
-i:ignorecase,忽略字符的大小写;
-o:仅显示匹配到的字符串本身;
-v,
--invert-match:显示不能被模式匹配到的行;
-E:支持使用扩展的正则表达式元字符;
-q,
--quiet, --silent:静默模式,即不输出任何信息;
-A #:after, 后#行
-B #:before,前#行
-C #:context,前后各#行
基本正则表达式元字符:
字符匹配:
. :匹配任意单个字符;
[]:匹配指定范围内的任意单个字符;
[^]:匹配指定范围外的任意单个字符;
[:digit:]:所有数字 [0-9]
[:lower:]:所有小写字母 [a-z]
[:upper:]:所有大写字母 [A-Z]
[:alpha:]:所有字母 [a-zA-Z]
[:alnum:]:所有字母和数字 [0-9a-zA-Z]
[:punct:]:所有标点符号
[:space:]:所有空白字符 空格后tab
匹配次数:用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数;默认工作于贪婪模式;
*:匹配其前面的字符任意次;0,1,多次;
.*:匹配任意长度的任意字符
\?:匹配其前面的字符0次或1次;即其前面的字符是可有可无的;
\+:匹配其前面的字符1次或多次;即其面的字符要出现至少1次;
\{m\}:匹配其前面的字符m次;
\{m,n\}:匹配其前面的字符至少m次,至多n次;
\{0,n\}:至多n次
\{m,\}:至少m次
位置锚定:
^:行首锚定;用于模式的最左侧;
$:行尾锚定;用于模式的最右侧;
^PATTERN$:用于PATTERN来匹配整行;
^$:空白行;
^[[:space:]]*$:空行或包含空白字符的行;
单词:非特殊字符组成的连续字符(字符串)都称为单词;
\<
或
\b:词首锚定,用于单词模式的左侧;
\>
或
\b:词尾锚定,用于单词模式的右侧;
\<PATTERN\>:匹配完整单词;
分组及引用
\(\):将一个或多个字符捆绑在一起,当作一个整体进行处理;
\(xy\)*ab
Note:分组括号中的模式匹配 到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:
\1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
\2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
\3
后向引用:引用前面的分组括号中的模式所匹配到的字符;
egrep:
支持扩展的正则表达式实现类似于grep文本过滤功能;grep -E
egrep [OPTIONS]
PATTERN [FILE...]
选项:
-i, -o, -v,
-q, -A, -B, -C
-G:支持基本正则表达式
扩展正则表达式的元字符:
字符匹配:
.:任意单个字符
[]:指定范围内的任意单个字符
[^]:指定范围外的任意单个字符
次数匹配:
*:任意次,0,1或多次;
?:0次或1次,其前的字符是可有可无的;
+:其前字符至少1次;
{m}:其前的字符m次;
{m,n}:至少m次,至多n次;
{0,n}
{m,}
位置锚定
^:行首锚定;
$:行尾锚定;
\<,
\b:词首锚定;
\>,
\b:词尾锚定;
分组及引用:
():分组;括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中;
后向引用:\1, \2, ...
或:
a|b:a或者b;
C|cat:C或cat
(c|C)at:cat或Cat
fgrep:不支持正则表达式元字符;
当无需要用到元字符去编写模式时,使用fgrep必能更好;
作业题;
显示/etc/passwd文件中不以/bin/bash结尾的行;
[root@localhost ~]# grep -v "/bin/bash$" /etc/passwd
找出/etc/passwd文件中的两位数或三位数;
[root@localhost ~]# grep "\<[0-9]\{2,3\}\>" /etc/passwd
找出/proc/meminfo文件中,所有以大写或小写S开头的行;至少有三种实现方式;
[root@localhost ~]# grep -i "^s" /proc/meminfo [root@localhost ~]# grep "^[sS]" /proc/meminfo [root@localhost ~]# grep -E "^(s|S)" /proc/meminfo
使用echo命令输出一绝对路径,使用egrep取出其路径名,类似执行dirname /etc/passwd的结果
[root@localhost ~]# echo /etc/sysconfig/ | grep -E -o "[^/]+/?$"
找出ifconfig中的IP地址,要求结果只显示IP地址
[root@localhost ~]# ifconfig |egrep -o "(([0-9]|[1-9]|[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9]|[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"
Vim定制自动缩进四个字符
步骤:1、打开/etc/vimrc文件
2.在末尾加入 set ts=4
三、编写shell脚本,实现自动添加三个用户,并计算这三个用户的uid之和
[root@localhost ~]# vim userAdd.sh #!/biin/bash #date 2018/12/2 #author gongxu #miaoshu 添加三个用户,并计算这三个用户的uid之和 if [ $# -lt 3 ];then echo "at less input three username" exit 5 fi if grep "^$1\>" /etc/passwd &> /dev/null;then echo "$1 exist" exit 1 else useradd $1 echo $1 | passwd --stdin $1 &> /dev/null echo "$1 add finished" fi if grep "^$2\>" /etc/passwd &> /dev/null;then echo "$2 exist" exit 2 else useradd $2 echo $2 | passwd --stdin $2 &> /dev/null echo "$2 add finished" fi if grep "^$3\>" /etc/passwd &> /dev/null;then echo "$3 exist" exit 3 else useradd $3 echo $3 | passwd --stdin $3 &> /dev/null echo "$3 add finished" fi id1=$(grep "^$1" /etc/passwd | cut -d : -f 3) id2=$(grep "^$2" /etc/passwd | cut -d : -f 3) id3=$(grep "^$3" /etc/passwd | cut -d : -f 3) id4=$[id1+id2+id3] echo "user: $1,$2,$3 uid sum=$id4"
四、find用法及其常用的实例演示
find命令作用:实时查找工具,通过遍历指定起始路径下文件系统层级结构完成文件查找;
find命令的工作特性:
查找速度略慢;
精确查找;
实时查找;
用法:find [OPTIONS] [查找起始路径] [查找条件] [处理动作]
查找起始路径:指定具体搜索目标起始路径;默认为当前目录;
查找条件:指定的查找标准,可以根据文件名、大小、类型、从属关系、权限等等标准进行;默认为找出指定路径下的所有文件;
处理动作:对符合查找条件的文件做出的操作,例如删除等操作;默认为输出至标准输出;
查找条件:表达式:选项和测试
测试:结果通常为布尔型("true", "false")
根据文件名查找:
-name "pattern"
-iname
"pattern"
支持glob风格的通配符;
*,
?, [], [^]
-regex
pattern:基于正则表达式模式查找文件,匹配是整个路径,而非其名;
根据文件从属关系查找:
-user
USERNAME:查找属主指定用户的所有文件;
-group
GRPNAME:查找属组指定组的所有文件;
-uid
UID:查找属主指定的UID的所有文件;
-gid
GID:查找属组指定的GID的所有文件;
-nouser:查找没有属主的文件;
-nogroup:查找没有属组的文件;
根据文件的类型查找:
例:find /etc -size +1M -type f –ls #-type 后表示文件类型的不需要在加
-,只有是find的参数才加
-
-type
TYPE:
f:
普通文件
d:
目录文件
l:符号链接文件
b:块设备 文件
c:字符设备文件
p:管道文件
s:套接字文件
组合测试:
与:-a, 默认组合逻辑;
或:-o
非:-not, !
实例:
1、 找出/tmp目录下属主为非root的所有文件;
[root@localhost ~]# find /tmp -not -user root -ls
2、 找出/tmp目录下文件名中不包含fstab字符串的文件;
[root@localhost ~]# find /tmp -not -name "*fstab*" -ls
3、找出/tmp目录下属主为非root,而且文件名不包含fstab字符串的文件;
[root@localhost ~]# find /tmp -not -user root -a -not -iname "*fstab*" -ls
或保留一个 -not,使用括号:
[root@localhost ~]# find /tmp -not \( -user root -o -not -iname "*fstab*" \) –ls
根据文件的大小查找:
-size [+|-]#UNIT
Unit的常用单位:k, M, G
#UNIT:(#-1, #]
-#UNIT:[0,#-1]
+#UNIT:(#, oo)
根据时间戳查找:
以“天”为单位:
-atime [+|-]#
#:[#, #-1)
-#:(#, 0]
+#:(oo, #-1]
-mtime
-ctime
以“分钟”为单位:
-amin
-mmin
-cmin
根据权限查找:
-perm [/|-]mode
mode:精确权限匹配; 例:find /tmp –perm 664
/mode:任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足;
9位权限之间存在“或”关系; 例:find /tmp –perm /222 –ls
-mode:每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足;
9位权限之间存在“与”关系;
处理动作:
-print:输出至标准输出;默认的动作;
-ls:类似于对查找到的文件执行“ls -l”命令,输出文件的详细信息;
-delete:删除查找到的文件;
-fls /PATH/TO/SOMEFILE:把查找到的所有文件的长格式信息保存至指定文件中;
-ok COMMAND {} \; :对查找到的每个文件执行由COMMAND表示的命令;每次操作都由用户进行确认;
例:find /tmp –nouser –nogroup –ok chown root:root {} \; #修改没有用户和用户组的文件,然后加上root用户。
注意:{}为查找到的文件名的集合,\; 为固定格式。
-exec COMMAND {} \; :对查找到的每个文件执行由COMMAND表示的命令;
例:find /tmp –perm /002 –exec mv {} {}.danger \; #修改其他用户有写权限的文件,将其文件名后面加上danger
注意:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令;
但是有些命令不能接受过长的参数,此时命令执行会失败;另一种方式可规避此问题:
find | xargs COMMAND
实例:
1、查找/var目录下属主为root,且属组为mail的所有文件或目录;
[root@localhost ~]# find /var -user root -a -group mail –ls
2、查找/usr目录下不属于root, bin或hadoop的所有文件或目录;用两种方法;
[root@localhost ~]# find /usr -not -user root -a -not -user bin -a -not -user hadoop
[root@localhost ~]# find /usr -not \( -user root -o -user bin -o -user hadoop \) -ls
3、查找/etc目录下最近一周内其内容修改过,且属主不是root用户也不是hadoop用户的文件或目录;
[root@localhost ~]# find /etc -mtime -7 -a -not \( -user root -o -user hadoop \) -ls
[root@localhost ~]# find /etc -mtime -7 -a -not -user root -a -not -user hadoop -ls
4、查找当前系统上没有属或属组,且最近一周内曾被访问过的文件或目录;
[root@localhost ~]# find / \( -nouser -o -nogroup \) -atime -7 -ls
5、查找/etc目录下大于1M且类型为普通文件的所有文件;
[root@localhost ~]# find /etc -size +1M -type f -exec ls -lh {} \;
6、查找/etc目录下所有用户都没有写权限的文件;
[root@localhost ~]# find /etc -not -perm /222 -type f -ls
7、查找/etc目录至少有一类用户没有执行权限的文件;
[root@localhost ~]# find /etc -not -perm -111 -type f -ls
8、查找/etc/init.d/目录下,所有用户都有执行权限,且其它用户有写权限的所有文件;
[root@localhost ~]# find /etc -perm -113 -type f –ls
[root@localhost ~]# find /etc/init.d/ -perm -111 -a -perm /002 -type f -ls
命令alias、gerp、find及基础Shell脚本的更多相关文章
- linux 基础 shell脚本命令
#########shell脚本命令#### 1.diff diff file file1 ####比较两个文件的不同 -c ####显示周围的行 -u ####按照一格式统一输出生成补丁 -r ## ...
- Linux基础-shell脚本知识整理和脚本编写----------变量、运算符、流程控制、函数、计划任务(发送邮件)
I:知识整理:变量.运算符.流程控制.函数.计划任务 变量 系统变量:set:显示所有变量 env:环境变量 常用系统变量: path pwd lang home his ...
- Bash基础——Shell脚本内部常用环境变量
$@和$*区别 不加引号的时候没区别 #! /usr/bin/bash function print_args_at { printf "%s\n" $@ echo $@ } fu ...
- Linux基础-Shell脚本
任务一目标:自动部署.初始配置.并启动nginx反向代理服务 把任务拆分来看-自动部署部分,就是先下载安装Nginx 首先建立一个很NB霸气的目录还有一个同样NB霸气的.sh文件 /NBshell/M ...
- Linux 命令详解(十)Shell脚本的数组详解
1.数组定义 [root@bastion-IDC ~]# a=( ) [root@bastion-IDC ~]# echo $a 一对括号表示是数组,数组元素用“空格”符号分割开. 2.数组读取与赋值 ...
- shell脚本编程基础
最近学习了shell脚本编程,感觉自己的脚本写的不太好,所以想把shell脚本相关的知识系统的整理一下,便于以后的学习和使用. 一.shell脚本基础 shell脚本是利用shell的功能 ...
- Linux基础篇–shell脚本编程基础
本章内容概要 编程基础 脚本基本格式 变量 运算 条件测试 配置用户环境 7.1 编程基础程序:指令+数据程序编程风格: 过程式:以指令为中心,数据服务于指令 对象式:以数据为中心 ...
- shell脚本-基础
shell脚本-基础 编程基础 程序是指令+ 数据 程序编程风格: 过程式:以指令为中心,数据服务于指令 对象式:以数据为中心,指令服务于数据 shell 程序提供了编程能力,解释执行. 计算运行二进 ...
- Linux Shell脚本面试25问
Q:1 Shell脚本是什么.它是必需的吗? 答:一个Shell脚本是一个文本文件,包含一个或多个命令.作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件( ...
随机推荐
- node,koa 图片批量添加水印,可手动配置水印位置
公司设计在处理京东上架商品图片的时候,需要给设计好的图片添加京东的“logo”,并且logo位置得根据图片来摆放,需要通过计算得出logo位置.那样太麻烦了,于是就用node,koa写了批量给图片添加 ...
- JavaScript学习——JS事件总结
回顾之前已经使用过的事件 (onsubmit.onclick.onload.onfocus.onblur.onmouseover.onmouseout) onfocus/onblur:聚焦离焦事件,用 ...
- hdu 1257/1800 - 贪心,dp
1257题目链接 一个序列划分子序列,每个子序列都是非增序列,问最少分成几个子序列 1800题目链接 一堆数分组,每组内数据严格递减,问最少分几组 -------------------------- ...
- GCD - Extreme (II) UVA - 11426 欧拉函数_数学推导
Code: #include<cstdio> using namespace std; const int maxn=4000005; const int R=4000002; const ...
- HDU 1667 The Rotation Game (A*迭代搜索)
题目大意:略 每次选择一个最大深度K,跑IDA* 估价函数H=8-中间8个格里出现次数最多的数的个数x,即把它填满这个数最少需要8-x次操作,如果dep+H>K,就跳出.. 深搜的时候暴力修改, ...
- 【jQuery02】点击标题面板显示内容
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- C语言传参的类型匹配
有一个这样的问题: 形参const char *p和实参char *c可以匹配 形参const char**p和实参char**c不可以匹配 注:argument和parameter:严格而言,par ...
- C语言计算字符串数组中每个字符串出现的个数
unsigned int str_num(char *str[], int num[], int len) { int i, j; int count; int flag[len]; ; i < ...
- Hive-jdbc获取sessionId
在HiveStatement中有一个sessHandle: public class HiveStatement implements java.sql.Statement { ... private ...
- HDU 5607 graph(矩阵优化+概率DP)
该题非常easy想到求概率的转移方程:用d[i][j]表示第i步,走到j点的概率. 可是该题的k高达1e9.所以依照套路.要用矩阵相乘来优化. 第一次写矩阵相乘. 大概的意思就是利用矩阵实现递推. 而 ...