{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This notebook was prepared by [Donne Martin](http://donnemartin.com). Source and license info is on [GitHub](https://github.com/donnemartin/data-science-ipython-notebooks)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Linux Commands\n",
    "\n",
    "* Disk Usage\n",
    "* Splitting Files\n",
    "* Grep, Sed\n",
    "* Compression\n",
    "* Curl\n",
    "* View Running Processes\n",
    "* Terminal Syntax Highlighting\n",
    "* Vim"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Disk Usage"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Display human-readable (-h) free disk space:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "!df -h"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Display human-readable (-h) disk usage statistics:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "!du -h ./"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Display human-readable (-h) disk usage statistics, showing only the total usage (-s):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "!du -sh ../"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Display the human-readable (-h) disk usage statistics, showing also the grand total for all file types (-c):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "!du -csh ./"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Splitting Files"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Count number of lines in a file with wc:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "!wc -l < file.txt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Count the number of lines in a file with grep:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "!grep -c \".\" file.txt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Split a file into multiple files based on line count:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "!split -l 20 file.txt new"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Split a file into multiple files based on line count, use suffix of length 1:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "!split -l 802 -a 1 file.csv dir/part-user-csv.tbl-"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Grep, Sed"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "List number of files matching ā€œ.txt\":"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "!ls -1 | grep .txt | wc -l"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Check number of MapReduce records processed, outputting the results to the terminal:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "!cat * | grep -c \"foo\" folder/part*"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Delete matching lines in place:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "!sed -i '/Important Lines: /dā€™ original_file"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Compression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# Compress zip\n",
    "!zip -r archive_name.zip folder_to_compress\n",
    "\n",
    "# Compress zip without invisible Mac resources\n",
    "!zip -r -X archive_name.zip folder_to_compress\n",
    "\n",
    "# Extract zip\n",
    "!unzip archive_name.zip\n",
    "\n",
    "# Compress TAR.GZ\n",
    "!tar -zcvf archive_name.tar.gz folder_to_compress\n",
    "\n",
    "# Extract TAR.GZ\n",
    "!tar -zxvf archive_name.tar.gz\n",
    "\n",
    "# Compress TAR.BZ2\n",
    "!tar -jcvf archive_name.tar.bz2 folder_to_compress\n",
    "\n",
    "# Extract TAR.BZ2\n",
    "!tar -jxvf archive_name.tar.bz2\n",
    "\n",
    "# Extract GZ\n",
    "!gunzip archivename.gz\n",
    "\n",
    "# Uncompress all tar.gz in current directory to another directory\n",
    "!for i in *.tar.gz; do echo working on $i; tar xvzf $i -C directory/ ; done"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Curl"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# Display the curl output:\n",
    "!curl donnemartin.com\n",
    "\n",
    "# Download the curl output to a file:\n",
    "!curl donnemartin.com > donnemartin.html\n",
    "\n",
    "# Download the curl output to a file -o\n",
    "!curl -o image.png http://i1.wp.com/donnemartin.com/wp-content/uploads/2015/02/splunk_cover.png\n",
    "\n",
    "# Download the curl output to a file, keeping the original file name -O\n",
    "!curl -O http://i1.wp.com/donnemartin.com/wp-content/uploads/2015/02/splunk_cover.png\n",
    "    \n",
    "# Download multiple files, attempting to reuse the same connection\n",
    "!curl -O url1 -O url2\n",
    "\n",
    "# Follow redirects -L\n",
    "!curl -L url\n",
    "\n",
    "# Resume a previous download -C -\n",
    "!curl -C - -O url\n",
    "\n",
    "# Authenticate -u\n",
    "!curl -u username:password url"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## View Running Processes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# Display sorted info about processes\n",
    "!top\n",
    "\n",
    "# Display all running processes\n",
    "!ps aux | less\n",
    "\n",
    "# Display all matching running processes with full formatting\n",
    "!ps -ef | grep python\n",
    "\n",
    "# See processes run by user dmartin\n",
    "!ps -u dmartin\n",
    "\n",
    "# Display running processes as a tree\n",
    "!pstree"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Terminal Syntax Highlighting"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Add the following to your ~/.bash_profile:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "export PS1='\\[\\033[01;32m\\]\\u@\\h\\[\\033[00m\\]:\\[\\033[01;34m\\]\\W\\[\\033[00m\\]\\$ '\n",
    "export CLICOLOR=1\n",
    "export LSCOLORS=ExFxBxDxCxegedabagacad\n",
    "alias ls='ls -GFh'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Reload .bash_profile:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "!source ~/.bash_profile"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Vim"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "Normal mode:  esc\n",
    "\n",
    "Basic movement:  h, j, k, l\n",
    "Word movement:  w, W, e, E, b, B\n",
    "\n",
    "Go to matching parenthesis:  %\n",
    "Go to start of the line:  0\n",
    "Go to end of the line:  $\n",
    "\n",
    "Find character:  f\n",
    "\n",
    "Insert mode:  i\n",
    "Append to line:  A\n",
    "\n",
    "Delete character:  x\n",
    "Delete command:  d\n",
    "Delete line:  dd\n",
    "\n",
    "Replace command:  r\n",
    "Change command:  c\n",
    "\n",
    "Undo:  u (U for all changes on a line)\n",
    "Redo:  CTRL-R\n",
    "\n",
    "Copy the current line:  yy\n",
    "Paste the current line:  p (P for paste above cursor)\n",
    "\n",
    "Quit without saving changes:  q!\n",
    "Write the current file and quit:  :wq"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Run the following command to enable the tutorial:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "!vimtutor"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Run the following commands to enable syntax colors:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "!cd ~\n",
    "!vim .vimrc\n",
    "# Add the following to ~/.vimrc\n",
    "syntax on\n",
    ":wq"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}