Shell 常用命令、基本用法总结
Filter
Filter 常用于从大量文本、数据中提取需求的部分。下面介绍几个常用的 filter 命令。
cut
$ cut -c 5-8 textfile.txt # 切出 textfile.txt 中每行的第 5 到第 8 个 character
$ cut -f2-4 -d',' textfile.txt # 切出 textfile.txt 中每行的第 2 到第 4 块 field,field 由 delimiter “,” 确定
$ cut -f2,4 -d'|' textfile.txt # 切出 textfile.txt 中每行的第 2 、第 4 块 field, field 由 delimiter “|” 确定
uniq
$ sort | uniq -c # aggregation (带 count),类似 SQL 中的 GROUPBY
egrep
$ egrep -o <pattern> textfile.txt # 只返回 match pattern 的部分
$ egrep -x <pattern> textfile.txt # 只有文件的某行 (line) fully match pattern 的时候才返回
$ egrep -w <pattern> textfile.txt # 只有文件的某字 (word) fully match pattern 的时候才返回
wc
$ wc -l textfile.txt # 返回行数计数
$ wc -m textfile.txt # 返回char计数
$ wc -w textfile.txt # 返回word计数
tr
$ tr <srcChars> <destChars> # 将输入字符中含有 srcChars 的字符对应替换成 destChars
$ tr 'a-z' 'A-Z' # 将输入字符的小写字母转为大写
$ tr -d ' ' # 删除输入字符中所有的空格
$ tr -cs 'a-zA-Z0-9' '\n' # 切出在 SET 'a-zA-Z0-9' 中的连续字符,并按行输出
sed
$ sed 's/regex/replacement/ig' # 将 match regex 的部分全部替换成 replacement
cat
$ cat >new_textfile.txt<<eof # 新建并从 stdin 按行写入文件 new_textfile.txt,直到遇到 eof 结束
$ cat >>new_textfile.txt<<eof # 从 stdin 按行连接写入文件 new_textfile.txt,直到遇到 eof 结束
Shell Script 入门
介绍 Shell 的一些常识和基本用法。
准备工作
Shell 脚本文件头
#!/bin/bash # 告诉 Linux 该文件用 bash 运行
可执行模式
$ chmod +x shell_script.sh # 修改 shell_script.sh 为可执行文件
常用命令
SSH
远程连接服务器(以 AWS 为例)
如果要连接 AWS, 需要联系管理员拿到私钥文件(扩展名为 .pem)。
$ ssh -i "private-key.pem" user_name@domain_name
如果想在 AWS 上运行 jupyter,tensorboard 等任务,可以使用 local forwarding 功能,将本地操作转发到远端服务器:
$ ssh -i "private-key.pem" <local-port>:127.0.0.1:<remote-port> user_name@domain_name
STDIN
$ read a_str_variable # 从 stdin 读取字符串存入 a_str_variable 变量
$ read -t 3 a_str_variable # 3s 内无输入则退出(返回值 142)
$ read -s a_str_variable # 不显示输入字符,输入密码等机密信息时使用
$ read -p "Name? " # 相当于 Python 中的 input("Name? ")
$ read -r a_str_variable # 当输入的字符中含 “\” (反斜杠)时,保留 “\”。如果没有设置 -r,则反斜杠都会被 “吃掉”
# 参考:https://unix.stackexchange.com/questions/18886/why-is-while-ifs-read-used-so-often-instead-of-ifs-while-read/18936#18936
STDOUT
$ echo string
图片转换
$ convert original_image.png converted_image.jpg # 图片格式转换,支持格式:jpg, png, gif, bmp, tif
$ convert -gravity south \ # 设置 draw text 的位置
-pointsize 36 \ # 设置字体大小
-draw "text 0,10 'Hello world'" original_image.jpg converted.jpg
文件搜索
$ find # 递归输出当前目录及其下所有文件或子目录,相当于`find . -print`
$ find dir # 递归输出dir 目录及其下所有文件或子目录
$ find dir -type f # 递归输出dir 目录下的所有文件
$ find dir -type d # 递归输出dir 目录及其下的所有子目录
$ find dir -name '*s2_COMP9041' # 递归输出dir 目录下所有符合通配符 `*s2_COMP9041` 的文件名或目录名(*此处不匹配斜杠/)
$ find dir -iname '*s2_comp9041'# 递归输出dir 目录下所有符合通配符 `*s2_comp9041` 的文件名或目录名(*此处不匹配斜杠/)(case insensitive)
$ find dir -path '*.sh' # 递归输出dir 目录下所有符合通配符 `*.sh` 的文件路径或目录路径(*此处匹配斜杠/)
$ find dir -ipath '*.SH' # 递归输出dir 目录下所有符合通配符 `*.sh` 的文件路径或目录路径(*此处匹配斜杠/)(case insensitive)
$ find dir -path '*.sh' \ # <或>操作
-or -path '*.pl' \
-or -path '*.py'
$ find dir -not -name '*.sh' \ # <非>操作
-type f
$ find dir -path '*.tmp' \ # <与>操作
-type f -delete # 递归删除dir 目录下所有路径符合通配符 `*.tmp` 的文件
$ find dir -name '*s2_COMP9041'\# 递归遍历dir 目录下所有
-type d \ # 的目录名
-prune # 如果目录名符合通配符 `'*s2_COMP9041'`,该目录下所有内容都被忽略
-print # 并输出(该选项可省略)
$ find dir -name '*s2_COMP9041'\# 递归遍历dir 目录下所有
-type d \ # 的目录名
-prune # 如果目录名符合通配符 `'*s2_COMP9041'`,该目录下所有内容都被忽略
-or -print # 输出其它未被忽略的目录及文件
# 有时可能仅仅需要排除目录,而非连同该目录下的所有文件。此时需要用到 -depth 选项
$ find dir -depth \ # 规定遍历顺序:遇到目录时,先列出目录中的文件,再列出目录自己
-name '*s2_COMP9041'\# 递归遍历dir 目录下所有
-type d \ # 的目录名
-prune # 如果目录名符合通配符 `'*s2_COMP9041'`,该目录下所有内容都被忽略
-or -print # 输出其它未被忽略的目录及文件
# 参考:https://math2001.github.io/post/bashs-find-command/
条件判断
#!/bin/bash
# 参数个数检查
if test $# -ne 2
# 或 if [ $# -ne 2 ]
# 或 if (( $# != 2 ))
then
echo Usage: "$0": '<non-negtive_int> <string>'
exit 1
fi
# 参数类型检查
if test $1 -ge 0
# 或 if [ $1 -ge 0 ]
then
:
else
echo "$0": argument 1 must be a non-negtive integer!
exit 2
fi
# 程序逻辑开始...
for
Loop
# 遍历当前目录中的所有文件名
## Version 1 ## 不包括隐藏文件 ##
$ shopt -u dotglob
$ for filename in *
> do echo $filename
> done
## Version 2 ## 包括隐藏文件 ##
$ shopt -s dotglob
$ for filename in *
> do echo $filename
> done
## 根据 argument 输入的目录路径 `important_files/*` 遍历其中(包括子目录)所有的文件
# Input: $ readfile.sh important_files/*
$ for paths in "$@" # 注意! 1.不是$1 2.Add double quotes
> do
> find $paths -type f -print0 |
> while read -d $'\0' path
> do echo $path
> done
> done
# 类似 C语言 的用法
$ begin=0; end=5; step=1
$ for ((i=$begin; ((i < $end)); ((i += $step)) ))
> do echo $i
> done
# write files from arguments by line with line number
line_no=0
for word in "$@"
do
((line_no+=1))
echo $line_no $word
done > filepath
while
Loop
# 类似 C语言 的用法
$ begin=0; end=5; step=1
$ i=$begin
$ while test $i -lt $end <OR> while [ $i -lt $end ] <OR> while (( i < end ))
> do echo $i
> (( i+=step ))
> done
# read files by line
while read line
do
echo $line
done < filepath
sh
$ sh -x your_shell_script.sh # 用于追踪程序流,debug 时很实用
一些细节
Silence
$ egrep 'regex' filename.txt >/dev/null 2>&1 # >/dev/null —— stdout(1) 被扔到 /dev/null
# >2>&1 —— stderr(2) 跟着 stdout(1) 走
# 总结:不在屏幕上打印 stdout 和 stderr
引号问题,date
用法,图片处理
# 实际应用:给图片打tag
$ date_time=`date "+%H:%M %d %b,%Y"`
$ convert -draw "text 0,0 '$date_time'" oringal.jpg tagged.jpg
Linux 文件名相关问题
文件名以 “-” 开头
$ mv -- filename(以‘-’开头) newfilename # -- 表示下一个参数不会是 Option(必须是文件名)
文件名中绝对不能包含的字符
['/', '\0']
文件名大小写敏感
$ touch important_file.db Important_File.Db IMPORTANT_FILE.DB
$ ls
important_file.db Important_File.Db IMPORTANT_FILE.DB
Shell 常用命令、基本用法总结的更多相关文章
- shell常用命令的用法
1. 如何把 /etc/passwd 中用户uid 大于500 的行给打印出来?awk -F ':' '$3>500' /etc/passwd 2. awk中 NR,NF两个变量表示什么含义?N ...
- Shell 常用命令总结
Shell常用命令总结 1 ls命令:列出文件 ls -la 列出当前目录下的所有文件和文件夹 ls a* 列出当前目录下所有以a字母开头的文件 ls -l *.txt 列出当前目录下所有后缀名 ...
- (转)Hbase shell 常用命令(1)
Hbase shell 常用命令(1) link:http://blog.csdn.net/scutshuxue/article/details/6988348 下面我们看看HBase Shell的一 ...
- hbase基本概念和hbase shell常用命令用法
1. 简介 HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一个结构化数据的分布式存储系统>.HBase是Google Bigtable的开源实 ...
- 【转载】HBase基本概念和hbase shell常用命令用法
1. 简介 HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一个结构化数据的分布式存储系统>.HBase是Google Bigtable的开源实 ...
- (三)Linux Shell编程——Shell常用命令(输出、判断、循环、函数、包含)
3. 常用命令 3.1 输出 3.1.1 echo命令 echo是Shell的一个内部指令,用于在屏幕上打印出指定的字符串.命令格式: echo arg name="coding" ...
- RedHat Linux Shell常用命令(多数也适用于Unix和AIX)
注:本文转载自疯狂的矩阵一文,http://www.cnblogs.com/520sojustdoit/p/4642568.html --------------------------------- ...
- Linux / mac OS Shell常用命令
一.文件.目录操作命令 1.ls命令 功能:显示文件和目录的信息 ls 以默认方式显示当前目录文件列表 ls -a 显示所有文件包括隐藏文件 ls -l 显示文件属性,包括大小,日期,符号连接,是否可 ...
- Linux/Mac/Shell常用命令
常用命令 · ls 查看当前目录下的文件 · cd 进入某目录 · cd - 跳转回前一目录 · cd ~ 进入当前用户个人目录 · pwd 输出当前所在路径 · mkdir 新建文件夹 · touc ...
随机推荐
- 【Javascript-ECMA6-Fetch详解】
Fetch 由于Fetch API是基于Promise设计,因此旧的浏览器并不支持该API,需要引用时引用es6-promise. 基本知识 fetch请求返回response格式 body Fetc ...
- SpringBoot自动装配的原理
1.SpringApplication.run(AppConfig.class,args);执行流程中有refreshContext(context);这句话. 2.refreshContext(co ...
- Eclipse报The default workspace'xxxxx' is in use or cannot be created Pl
原因:出现这种情况一般是workspace的配置文件中出现了.lock文件(workspace/.metadata/.lock),锁定了workspace.把.lock文件删除即可.如果该文件不能删除 ...
- pm2命令管理启动的nodejs项目进程
安装 npm install -g pm2 用法 $ npm install pm2 -g # 命令行安装 pm2 $ pm2 start app.js -i 4 #后台运行pm2,启动4个app.j ...
- php源码建博客2--实现单入口MVC结构
主要: MVC目录结构 数据库工具类制作 创建公共模型类和公共控制器类 --------------文件结构:-------------------------------------- blog├─ ...
- ruby中的respond to ?用法
今天写脚本,遇到了这个函数,遂搜索及阅读相关代码,整理如下: respond_to 是判断是否是某个类型的方法,比如: ar = "ss" p ar.respond_to?(:to ...
- ubuntu解决网易云无法打开
最近首次入手ubuntu18 摸索了很久,当然网易云是不可缺少的一部分,在配置好各种环境+程序后,也找到了解决网易云的方法了. 首先安装好网易云 默认情况下需要在终端使用 sudo 才能运行 解决的办 ...
- 插入排序,C语言实现
插入排序是稳定排序,时间复杂度最低为O(n),最高为O(n^2),平均为O(n^2). 插入排序是将数组分为两部分,一部分已经排好序,另一部分未排好序,每次从未排好序的部分取第一个元素插入到已经排好序 ...
- 20154327 Exp2 后门原理与实践
实践内容 使用netcat和socat.msf-meterpreter等工具获得主机权限,并进行一些恶意行为,如监控摄像头.记录键盘输入.截屏等. 详情见实验指导书 实践过程 netcat netca ...
- 北京Uber优步司机奖励政策(3月4日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...