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 常用命令、基本用法总结的更多相关文章

  1. shell常用命令的用法

    1. 如何把 /etc/passwd 中用户uid 大于500 的行给打印出来?awk -F ':' '$3>500' /etc/passwd 2. awk中 NR,NF两个变量表示什么含义?N ...

  2. Shell 常用命令总结

      Shell常用命令总结 1  ls命令:列出文件 ls -la 列出当前目录下的所有文件和文件夹 ls a* 列出当前目录下所有以a字母开头的文件 ls -l *.txt 列出当前目录下所有后缀名 ...

  3. (转)Hbase shell 常用命令(1)

    Hbase shell 常用命令(1) link:http://blog.csdn.net/scutshuxue/article/details/6988348 下面我们看看HBase Shell的一 ...

  4. hbase基本概念和hbase shell常用命令用法

    1. 简介 HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一个结构化数据的分布式存储系统>.HBase是Google Bigtable的开源实 ...

  5. 【转载】HBase基本概念和hbase shell常用命令用法

    1. 简介 HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一个结构化数据的分布式存储系统>.HBase是Google Bigtable的开源实 ...

  6. (三)Linux Shell编程——Shell常用命令(输出、判断、循环、函数、包含)

    3. 常用命令 3.1 输出 3.1.1 echo命令 echo是Shell的一个内部指令,用于在屏幕上打印出指定的字符串.命令格式: echo arg name="coding" ...

  7. RedHat Linux Shell常用命令(多数也适用于Unix和AIX)

    注:本文转载自疯狂的矩阵一文,http://www.cnblogs.com/520sojustdoit/p/4642568.html --------------------------------- ...

  8. Linux / mac OS Shell常用命令

    一.文件.目录操作命令 1.ls命令 功能:显示文件和目录的信息 ls 以默认方式显示当前目录文件列表 ls -a 显示所有文件包括隐藏文件 ls -l 显示文件属性,包括大小,日期,符号连接,是否可 ...

  9. Linux/Mac/Shell常用命令

    常用命令 · ls 查看当前目录下的文件 · cd 进入某目录 · cd - 跳转回前一目录 · cd ~ 进入当前用户个人目录 · pwd 输出当前所在路径 · mkdir 新建文件夹 · touc ...

随机推荐

  1. git-git remote

    使用git的时候难免会用到remote tracking,下面简要记录一下在使用git remote时的一些技巧 (1)add $git remote add origin https://githu ...

  2. max-height实现任意高度元素的展开收缩动画

    http://dobinspark.com.cn/ 前言: 在说到实现元素的展开收缩,通常的想法是通过控制display的元素属性和none之间的切换,虽然说功能可以实现,但是这种展开是没有任何动画的 ...

  3. JavaScript-比较运算符

    一.概述 > 大于运算符 < 小于运算符 <= 小于或者等于运算符 >= 大于或者等于运算符 == 相等运算符 === 严格相等运算符 != 不相等运算符 !== 严格不相等运 ...

  4. phalcon框架与Volt 模块引擎 使用简介

      ———— 近期工作中web页面使用由C语言编写的Volt模板引擎,相比之前由js动态加载页面速度更快,更利于百度数据的抓取,现根据文档整理一下使用思路 (Volt是一个超快速和设计者友好的模板语言 ...

  5. Git 远程推送被拒绝的一种解决方案

    今天在推送的时候发生了如下错误信息: error: 无法推送一些引用到 'https://gitee.com/von_w/demo_app.git'提示:更新被拒绝,因为您当前分支的最新提交落后于其对 ...

  6. 用JQ实现的一个简单轮播

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>lb ...

  7. vue-cli3 vue.config.js 配置

    // cli_api配置地址 https://cli.vuejs.org/zh/config/ module.exports = { baseUrl: './', // 部署应用包时的基本 URL o ...

  8. Spring Security学习笔记(三)

    之前提到过认证后怎么存放用户信息,令牌token是一种方式,session是另一种方式,这里介绍使用spring session data redis存储httpSession. 添加了以上依赖后,我 ...

  9. day 26 网络知识 01

    一.    c/s 架构: 客户端(client)/服务端(server)架构       服务端: 提供服务的      客户端: 享受服务的     B/S 架构:浏览器(browser)/服务端 ...

  10. array of TVarRec 动态数组使用

    FDQuery.AppendRecord()里是一个array of TVarRec.我们一般都是直接用[Var1,Var2,...].这样手工输入,但如果增加的元素我们预先不知道,就要声明一个arr ...