Last active
September 15, 2017 03:09
-
-
Save onceupon/b225f26c4cbc6eb4c41c3a4f09ba9ed7 to your computer and use it in GitHub Desktop.
Bash Oneliner will focus on bash commands for parsing plain text and biological data, which usually are tsv files(tab-separated values); some of the commands are for Linux system maintenance. I apologize that there won't be any citation of the code, but they are probably from dear Google and Stackoverflow.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# ### Bash-Oneliner | |
# Hi bash learners and bioinformaticans, welcome to Bash Oneliner. I started studying bioinformatics data three years ago (recently started working on cloud computing), and was amazed by those single-word bash commands which are much faster than my dull scripts, so i started bash. Not all the code here is oneliner (if the ';' counts..), but i put effort on making them brief and fast. | |
# This blog will focus on simple bash commands for parsing data, most of which are for tsv files (tab-separated values); some of them are for Linux system maintenance. I apologize that there won't be any citation for the codes, but they are probably from dear Google and Stackoverflow. | |
# English and bash are not my first language, so... correct me anytime, thank you | |
# In case you would like to check and vote up my questions on Stackoverflow, here's my page: | |
# http://stackoverflow.com/users/4290753/once | |
# Here's a more stylish version of Bash-Oneliner~ | |
# http://onceupon.github.io/Bash-Oneliner/ | |
# ## Handy Bash oneliner commands for tsv file editing | |
# - [Grep](#grep) | |
# - [Sed](#sed) | |
# - [Awk](#awk) | |
# - [Xargs](#xargs) | |
# - [Find](#find) | |
# - [Loops](#loops) | |
# - [Math](#math) | |
# - [Download](#download) | |
# - [Random](#random) | |
# - [Xwindow](#xwindow) | |
# - [Others](#others) | |
# - [System](#system) | |
## Grep | |
##### Extract text bewteen words (e.g. w1,w2) | |
grep -o -P '(?<=w1).*(?=w2)' | |
##### Grep lines without word (e.g. bbo) | |
grep -v bbo filename | |
##### Grep only one/first match (e.g. bbo) | |
grep -m 1 bbo filename | |
##### Grep and count (e.g. bbo) | |
grep -c bbo filename | |
##### Insensitive grep (e.g. bbo/BBO/Bbo) | |
grep -i "bbo" filename | |
##### Count occurrence (e.g. three times a line count three times) | |
grep -o bbo filename | |
##### COLOR the match (e.g. bbo)! | |
grep --color bbo filename | |
##### Grep search all files in a directory(e.g. bbo) | |
grep -R bbo /path/to/directory | |
# or | |
grep -r bbo /path/to/directory | |
##### Search all files in directory, only output file names with matches(e.g. bbo) | |
grep -Rh bbo /path/to/directory | |
# or | |
grep -rh bbo /path/to/directory | |
##### Grep OR (e.g. A or B or C or D) | |
grep 'A\|B\|C\|D' | |
##### Grep AND (e.g. A and B) | |
grep 'A.*B' | |
##### Grep all content of a fileA from fileB | |
grep -f fileA fileB | |
##### Grep a tab | |
grep $'\t' | |
##### Grep variable from variable | |
$echo "$long_str"|grep -q "$short_str" | |
if [ $? -eq 0 ]; then echo 'found'; fi | |
# grep -q will output 0 if match found | |
# remember to add space between []! | |
##### Grep strings between a bracket() | |
grep -oP '\(\K[^\)]+' | |
##### Grep number of characters with known strings in between(e.g. AAEL000001-RA) | |
grep -o -w "\w\{10\}\-R\w\{1\}" | |
# \w word character [0-9a-zA-Z_] \W not word character | |
##### A lot examples here: http://www.cyberciti.biz/faq/grep-regular-expressions/ | |
## Sed | |
##### Remove lines with word (e.g. bbo) | |
sed "/bbo/d" filename | |
##### Edit infile (edit and save) | |
sed -i "/bbo/d" filename | |
##### When using variable (e.g. $i), use double quotes " " | |
# e.g. add >$i to the first line (to make a FASTA file) | |
sed "1i >$i" | |
# notice the double quotes! in other examples, you can use a single quote, but here, no way! | |
# '1i' means insert to first line | |
##### Delete empty lines | |
sed '/^\s*$/d' | |
# or | |
sed 's/^$/d' | |
##### Delete last line | |
sed '$d' | |
##### Delete last character from end of file | |
sed -i '$ s/.$//' filename | |
##### Add string to end of file (e.g. "]") | |
sed '$s/$/]/' filename | |
##### Add newline to the end | |
sed '$a\' | |
##### Add string to beginning of every line (e.g. bbo) | |
sed -e 's/^/bbo/' file | |
##### Add string to end of each line (e.g. "}") | |
sed -e 's/$/\}\]/' filename | |
##### Add \n every nth character (e.g. every 4th character) | |
sed 's/.\{4\}/&\n/g' | |
##### Concatenate/combine/join files with a seperator and next line (e.g seperate by ",") | |
sed -s '$a,' *.json > all.json | |
##### Substitution (e.g. replace A by B) | |
sed 's/A/B/g' filename | |
##### Select lines start with string (e.g. bbo) | |
sed -n '/^@S/p' | |
##### Delete lines with string (e.g. bbo) | |
sed '/bbo/d' filename | |
##### Print every nth lines | |
sed -n '0~3p' filename | |
# catch 0: start; 3: step | |
##### Print every odd # lines | |
sed -n '1~2p' | |
##### Print every third line including the first line | |
sed -n '1p;0~3p' | |
##### Remove leading whitespace and tabs | |
sed -e 's/^[ \t]*//' | |
# notice a whitespace before '\t'!! | |
##### Remove only leading whitespace | |
sed 's/ *//' | |
# notice a whitespace before '*'!! | |
##### Remove ending commas | |
sed 's/,$//g' | |
##### Add a column to the end | |
sed "s/$/\t$i/" | |
# $i is the valuable you want to add | |
# e.g. add the filename to every last column of the file | |
for i in $(ls);do sed -i "s/$/\t$i/" $i;done | |
##### Add extension of filename to last column | |
for i in T000086_1.02.n T000086_1.02.p;do sed "s/$/\t${i/*./}/" $i;done >T000086_1.02.np | |
##### Remove newline\ nextline | |
sed ':a;N;$!ba;s/\n//g' | |
##### Print a number of lines (e.g. line 10th to line 33 rd) | |
sed -n '10,33p' <filename | |
##### Change delimiter | |
sed 's=/=\\/=g' | |
##### Replace with wildcard (e.g A-1-e or A-2-e or A-3-e....) | |
sed 's/A-.*-e//g' filename | |
##### Remove last character of file | |
sed '$ s/.$//' | |
##### Insert character at specified position of file (e.g. AAAAAA --> AAA#AAA) | |
sed -r -e 's/^.{3}/&#/' file | |
## Awk | |
##### Set tab as field separator | |
awk -F $'\t' | |
##### Output as tab separated (also as field separator) | |
awk -v OFS='\t' | |
##### Pass variable | |
a=bbo;b=obb; | |
awk -v a="$a" -v b="$b" "$1==a && $10=b" filename | |
##### Print line number and number of characters on each line | |
awk '{print NR,length($0);}' filename | |
##### Find number of columns | |
awk '{print NF}' | |
##### Reverse column order | |
awk '{print $2, $1}' | |
##### Check if there is a comma in a column (e.g. column $1) | |
awk '$1~/,/ {print}' | |
##### Split and do for loop | |
awk '{split($2, a,",");for (i in a) print $1"\t"a[i]}' filename | |
##### Print all lines before nth occurence of a string (e.g stop print lines when bbo appears 7 times) | |
awk -v N=7 '{print}/bbo/&& --N<=0 {exit}' | |
##### Print filename and last line of all files in directory | |
ls|xargs -n1 -I file awk '{s=$0};END{print FILENAME,s}' file | |
##### Add string to the beginning of a column (e.g add "chr" to column $3) | |
awk 'BEGIN{OFS="\t"}$3="chr"$3' | |
##### Remove lines with string (e.g. bbo) | |
awk '!/bbo/' file | |
##### Column subtraction | |
cat file| awk -F '\t' 'BEGIN {SUM=0}{SUM+=$3-$2}END{print SUM}' | |
##### Usage and meaning of NR and FNR | |
# e.g. | |
# fileA: | |
# a | |
# b | |
# c | |
# fileB: | |
# d | |
# e | |
awk 'print FILENAME, NR,FNR,$0}' fileA fileB | |
# fileA 1 1 a | |
# fileA 2 2 b | |
# fileA 3 3 c | |
# fileB 4 1 d | |
# fileB 5 2 e | |
##### AND gate | |
# e.g. | |
# fileA: | |
# 1 0 | |
# 2 1 | |
# 3 1 | |
# 4 0 | |
# fileB: | |
# 1 0 | |
# 2 1 | |
# 3 0 | |
# 4 1 | |
awk -v OFS='\t' 'NR=FNR{a[$1]=$2;next} NF {print $1,((a[$1]=$2)? $2:"0")}' fileA fileB | |
# 1 0 | |
# 2 1 | |
# 3 0 | |
# 4 0 | |
##### Round all numbers of file (e.g. 2 significant figure) | |
awk '{while (match($0, /[0-9]+\[0-9]+/)){ | |
\printf "%s%.2f", substr($0,0,RSTART-1),substr($0,RSTART,RLENGTH) | |
\$0=substr($0, RSTART+RLENGTH) | |
\} | |
\}' | |
##### Give number/index to every row | |
awk '{printf("%s\t%s\n",NR,$0)}' | |
##### Break combine column data into rows | |
# e.g. | |
# seperate | |
# David cat,dog | |
# into | |
# David cat | |
# David dog | |
# detail here: http://stackoverflow.com/questions/33408762/bash-turning-single-comma-separated-column-into-multi-line-string | |
awk '{split($2,a,",");for(i in a)print $1"\t"a[i]}' file | |
##### Sum up a file (each line in file contains only one number) | |
awk '{s+=$1} END {print s}' filename | |
##### Average a file (each line in file contains only one number) | |
awk '{s+=$1}END{print s/NR}' | |
##### Print field start with string (e.g Linux) | |
awk '$1 ~ /^Linux/' | |
##### Sort a row (e.g. 1 40 35 12 23 --> 1 12 23 35 40) | |
awk ' {split( $0, a, "\t" ); asort( a ); for( i = 1; i <= length(a); i++ ) printf( "%s\t", a[i] ); printf( "\n" ); }' | |
##### Subtract previous row values (add column6 which equal to column4 minus last column5) | |
awk '{$6 = $4 - prev5; prev5 = $5; print;}' | |
## Xargs | |
##### Set tab as delimiter (default:space) | |
xargs -d\t | |
##### Display 3 items per line | |
echo 1 2 3 4 5 6| xargs -n 3 | |
# 1 2 3 | |
# 4 5 6 | |
##### Prompt before execution | |
echo a b c |xargs -p -n 3 | |
##### Print command along with output | |
xargs -t abcd | |
# /bin/echo abcd | |
# abcd | |
##### With find and rm | |
find . -name "*.html"|xargs rm -rf | |
##### Delete fiels with whitespace in filename (e.g. "hello 2001") | |
find . -name "*.c" -print0|xargs -0 rm -rf | |
##### Show limits | |
xargs --show-limits | |
##### Move files to folder | |
find . -name "*.bak" -print 0|xargs -0 -I {} mv {} ~/old | |
or | |
find . -name "*.bak" -print 0|xargs -0 -I file mv file ~/old | |
##### Move first 100th files to a directory (e.g. d1) | |
ls |head -100|xargs -I {} mv {} d1 | |
##### Parallel | |
time echo {1..5} |xargs -n 1 -P 5 sleep | |
# a lot faster than | |
time echo {1..5} |xargs -n1 sleep | |
##### Copy all files from A to B | |
find /dir/to/A -type f -name "*.py" -print 0| xargs -0 -r -I file cp -v -p file --target-directory=/path/to/B | |
# v: verbose| | |
# p: keep detail (e.g. owner) | |
##### With sed | |
ls |xargs -n1 -I file sed -i '/^Pos/d' filename | |
##### Add the file name to the first line of file | |
ls |sed 's/.txt//g'|xargs -n1 -I file sed -i -e '1 i\>file\' file.txt | |
##### Count all files | |
ls |xargs -n1 wc -l | |
##### Turn output into a single line | |
ls -l| xargs | |
##### Count files within directories | |
echo mso{1..8}|xargs -n1 bash -c 'echo -n "$1:"; ls -la "$1"| grep -w 74 |wc -l' -- | |
# "--" signals the end of options and display further option processing | |
##### Download dependencies files and install (e.g. requirements.txt) | |
cat requirements.txt| xargs -n1 sudo pip install | |
##### Count lines in all file, also count total lines | |
ls|xargs wc -l | |
##### Xargs and grep | |
cat grep_list |xargs -I{} grep {} filename | |
## Find | |
##### List all sub directory/file in the current directory | |
find . | |
##### List all files under the current directory | |
find . -type f | |
##### List all directories under the current directory | |
find . -type d | |
##### Edit all files under current directory (e.g. replace 'www' with 'ww') | |
find . name '*.php' -exec sed -i 's/www/w/g' {} \; | |
# if no subdirectory | |
replace "www" "w" -- * | |
# a space before * | |
##### Find and output only filename (e.g. "mso") | |
find mso*/ -name M* -printf "%f\n" | |
##### Find and delete file with size less than (e.g. 74 byte) | |
find . -name "*.mso" -size -74c -delete | |
# M for MB, etc | |
## Loops | |
##### While loop, column subtraction of a file (e.g. a 3 columns file) | |
while read a b c; do echo $(($c-$b));done < <(head filename) | |
# there is a space between the two '<'s | |
##### While loop, sum up column subtraction | |
i=0; while read a b c; do ((i+=$c-$b)); echo $i; done < <(head filename) | |
##### If loop | |
if (($j==$u+2)) | |
# (( )) use for arithmetic operation | |
if [[$age >21]] | |
# [[ ]] use for comparison | |
##### Test if file exist | |
if [ -e 'filename' ] | |
then | |
echo -e "file exists!" | |
fi | |
##### For loop | |
for i in $(ls); do echo file $i;done | |
## Math | |
##### Print out the prime factors of a number (e.g. 50) | |
factor 50 | |
##### Simple math with expr | |
expr 10+20 #30 | |
expr 10\*20 #600 | |
expr 30 \> 20 #1 (true) | |
##### More math with bc | |
# - Number of decimal digit/ significant figure | |
echo "scale=2;2/3" | bc | |
#.66 | |
# - Exponent operator | |
echo "10^2" | bc | |
#100 | |
# - Using variables | |
echo "var=5;--var"| bc | |
#4 | |
## Download | |
##### Download all from a page | |
wget -r -l1 -H -t1 -nd -N -np -A mp3 -e robots=off http://example.com | |
# -r: recursive and download all links on page | |
# -l1: only one level link | |
# -H: span host, visit other hosts | |
# -t1: numbers of retries | |
# -nd: don't make new directories, download to here | |
# -N: turn on timestamp | |
# -nd: no parent | |
# -A: type (seperate by ,) | |
# -e robots=off: ignore the robots.txt file which stop wget from crashing the site, sorry example.com | |
##### Upload a file to web and download (https://transfer.sh/) | |
# --> upload: | |
curl --upload-file ./filename.txt https://transfer.sh/filename.txt | |
# (the above command will return a URL, e.g: https://transfer.sh/tG8rM/filename.txt) | |
# --> download: | |
curl https://transfer.sh/tG8rM/filename.txt -o filename.txt | |
##### Download file if necessary | |
data=file.txt | |
url=http://www.example.com/$data | |
if [! -s $data];then | |
echo "downloading test data..." | |
wget $url | |
fi | |
##### Wget to a filename (when a long name) | |
wget -O filename "http://example.com" | |
##### Wget files to a folder | |
wget -P /path/to/directory "http://example.com" | |
## Random | |
##### Random pick 100 lines from a file | |
shuf -n 100 filename | |
##### Random order (lucky draw) | |
for i in a b c d e; do echo $i; done| shuf | |
##### Echo series of random numbers between a range (e.g. shuffle numbers from 0-100, then pick 15 of them randomly) | |
shuf -i 0-100 -n 15 | |
##### Echo a random number | |
echo $RANDOM | |
##### Random from 0-9 | |
echo $((RANDOM % 10)) | |
##### Random from 1-10 | |
echo $(((RANDOM %10)+1)) | |
## Xwindow | |
# X11 GUI applications! Here are some GUI tools for you if you get bored by the text-only environment. | |
##### Enable X11 forwarding,in order to use graphical application on servers | |
ssh -X user_name@ip_address | |
# or setting through xhost | |
# --> Install the following for Centos: | |
# xorg-x11-xauth | |
# xorg-x11-fonts-* | |
# xorg-x11-utils | |
##### Little xwindow tools | |
xclock | |
xeyes | |
xcowsay | |
##### Open pictures/images from ssh server | |
# 1. ssh -X user_name@ip_address | |
# 2. apt-get install eog | |
# 3. eog picture.png | |
##### Use gedit on server (GUI editor) | |
# 1. ssh -X user_name@ip_address | |
# 2. apt-get install gedit | |
# 3. gedit filename.txt | |
##### Open PDF file from ssh server | |
# 1. ssh -X user_name@ip_address | |
# 2. apt-get install evince | |
# 3. evince filename.pdf | |
##### Use google-chrome browser from ssh server | |
# 1. ssh -X user_name@ip_address | |
# 2. apt-get install libxss1 libappindicator1 libindicator7 | |
# 3. wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb | |
# 4. sudo apt-get install -f | |
# 5. dpkg -i google-chrome*.deb | |
# 6. google-chrome | |
## Others | |
##### Remove newline / nextline | |
tr --delete '\n' <input.txt >output.txt | |
##### Replace newline | |
tr '\n' ' ' <filename | |
##### To uppercase/lowercase | |
tr /a-z/ /A-Z/ | |
##### Compare files (e.g. fileA, fileB) | |
diff fileA fileB | |
# a: added; d:delete; c:changed | |
# or | |
sdiff fileA fileB | |
# side-to-side merge of file differences | |
##### Number a file (e.g. fileA) | |
nl fileA | |
# or | |
nl -nrz fileA | |
# add leading zeros | |
##### Combine/ paste two files (e.g. fileA, fileB) | |
paste fileA fileB | |
# default tab seperated | |
##### Reverse string | |
echo 12345| rev | |
##### Read .gz file without extracting | |
zmore filename | |
# or | |
zless filename | |
##### Run in background, output error file | |
seq 100 &>log & | |
# or | |
seq 100 2>log & | |
# or | |
seq 100 2>&1| tee logfile | |
# or | |
seq 100 2>&1 >>outfile | |
# 0: standard input; 1: standard output; 2: standard error | |
##### Send mail | |
echo 'heres the content'| mail -A 'file.txt' -s 'mail.subject' [email protected] | |
# use -a flag to set send from (-a "From: [email protected]") | |
##### .xls to csv | |
xls2csv filename | |
##### Append to file (e.g. hihi) | |
echo 'hihi' >>filename | |
##### Make BEEP sound | |
speaker-test -t sine -f 1000 -l1 | |
##### Set beep duration | |
(speaker-test -t sine -f 1000) & pid=$!;sleep 0.1s;kill -9 $pid | |
##### History edit/ delete | |
~/.bash_history | |
# or | |
history -d [line_number] | |
##### Get last history/record filename | |
head !$ | |
##### Clean screen | |
clear | |
# or | |
Ctrl+l | |
##### Send data to last edited file | |
cat /directory/to/file | |
echo 100>!$ | |
##### Run history number (e.g. 53) | |
!53 | |
##### Run last command | |
!! | |
##### Run last command that began with (e.g. cat filename) | |
!cat | |
or | |
!c | |
# run cat filename again | |
##### Extract .xf | |
1.unxz filename.tar.xz | |
2.tar -xf filename.tar | |
##### Install python package | |
pip install packagename | |
##### Delete current bash command | |
Ctrl+U | |
# or | |
Ctrl+C | |
# or | |
Alt+Shift+# | |
# to make it to history | |
##### Add something to history (e.g. "addmetohistory") | |
#addmetodistory | |
# just add a "#" before~~ | |
##### Sleep awhile or wait for a moment or schedule a job | |
sleep 5;echo hi | |
##### Count the time for executing a command | |
time echo hi | |
##### Backup with rsync | |
rsync -av filename filename.bak | |
rsync -av directory directory.bak | |
rsync -av --ignore_existing directory/ directory.bak | |
rsync -av --update directory directory.bak | |
rsync -av directory user@ip_address:/path/to/directory.bak | |
# skip files that are newer on receiver (i prefer this one!) | |
##### Make all directories at one time! | |
mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat} | |
# -p: make parent directory | |
# this will create project/doc/html/; project/doc/info; project/lib/ext ,etc | |
##### Run command only if another command returns zero exit status (well done) | |
cd tmp/ && tar xvf ~/a.tar | |
##### Run command only if another command returns non-zero exit status (not finish) | |
cd tmp/a/b/c ||mkdir -p tmp/a/b/c | |
##### Extract to a path | |
tar xvf -C /path/to/directory filename.gz | |
##### Use backslash "\" to break long command | |
cd tmp/a/b/c \ | |
> || \ | |
>mkdir -p tmp/a/b/c | |
##### Get pwd | |
VAR=$PWD; cd ~; tar xvf -C $VAR file.tar | |
# PWD need to be capital letter | |
##### List file type of file (e.g. /tmp/) | |
file /tmp/ | |
# tmp/: directory | |
##### Bash script | |
#!/bin/bash | |
file=${1#*.} | |
# remove string before a "." | |
file=${1%.*} | |
# remove string after a "." | |
##### Search from history | |
Ctrl+r | |
##### Python simple HTTP Server | |
python -m SimpleHTTPServer | |
##### Variables | |
{i/a/,} | |
# e.g. replace all | |
{i//a/,} | |
# for variable i, replace all 'a' with a comma | |
##### Read user input | |
read input | |
echo $input | |
##### Generate sequence 1-10 | |
seq 10 | |
##### Sum up input list (e.g. seq 10) | |
seq 10|paste -sd+|bc | |
##### Find average of input list/file | |
i=`wc -l filename|cut -d ' ' -f1`; cat filename| echo "scale=2;(`paste -sd+`)/"$i|bc | |
##### Generate all combination (e.g. 1,2) | |
echo {1,2}{1,2} | |
# 1 1, 1 2, 2 1, 2 2 | |
##### Generate all combination (e.g. A,T,C,G) | |
set = {A,T,C,G} | |
group= 5 | |
for ((i=0; i<$group; i++));do | |
repetition=$set$repetition;done | |
bash -c "echo "$repetition"" | |
##### Read file content to variable | |
foo=$(<test1) | |
##### Echo size of variable | |
echo ${#foo} | |
##### Echo tab | |
echo -e ' \t ' | |
##### Array | |
declare -A array=() | |
##### Send a directory | |
scp -r directoryname user@ip:/path/to/send | |
##### Split file into lines (e.g. 1000 lines/smallfile) | |
split -d -l 1000 bigfilename | |
##### Rename all files (e.g. remove ABC from all .gz files) | |
rename 's/ABC//' *.gz | |
##### Remove extention (e.g remove .gz from filename.gz) | |
basename filename.gz .gz | |
zcat filename.gz> $(basename filename.gz .gz).unpacked | |
##### Use the squeeze repeat option (e.g. /t/t --> /t) | |
tr -s "/t" < filename | |
##### Do not print nextline with echo | |
echo -e 'text here \c' | |
##### Use the last argument | |
!$ | |
##### Check last exit code | |
echo $? | |
##### View first 50 characters of file | |
head -c 50 file | |
##### Group/combine rows into one row | |
# e.g. | |
# AAAA | |
# BBBB | |
# CCCC | |
# DDDD | |
cat filename|paste - - | |
# --> | |
# AAAABBBB | |
# CCCCDDDD | |
cat filename|paste - - - - | |
# --> | |
# AAAABBBBCCCCDDDD | |
##### Fastq to fasta | |
cat file.fastq | paste - - - - | sed 's/^@/>/g'| cut -f1-2 | tr '\t' '\n' >file.fa | |
##### Cut and get last column | |
cat file|rev | cut -d/ -f1 | rev | |
##### Add one to variable/increment a numeric variable (e.g. $var) | |
((var++)) | |
##### Some handy environment variables | |
# $0 :name of shell or shell script. | |
# $1, $2, $3, ... :positional parameters. | |
# $# :number of positional parameters. | |
# $? :most recent foreground pipeline exit status. | |
# $- :current options set for the shell. | |
# $$ :pid of the current shell (not subshell). | |
# $! :is the PID of the most recent background command. | |
##### Clear the contents of a file (e.g. filename) | |
>filename | |
##### Unzip tar.bz2 file (e.g. file.tar.bz2) | |
tar xvfj file.tar.bz2 | |
##### Output a y/n repeatedly until killed | |
# 'y': | |
yes | |
# or 'n': | |
yes n | |
# or 'anything': | |
yes anything | |
# For example: | |
yes | rm -r large_directory | |
##### Create dummy file of certain size instantly (e.g. 200mb) | |
dd if=/dev/zero of=//dev/shm/200m bs=1024k count=200 | |
# Standard output: | |
# 200+0 records in | |
# 200+0 records out | |
# 209715200 bytes (210 MB) copied, 0.0955679 s, 2.2 GB/s | |
##### Cat to a file | |
cat >myfile | |
let me add sth here | |
exit by control + c | |
^C | |
##### Keep /repeatedly executing the same command (e.g Repeat 'wc -l filename' every 1 second) | |
watch -n 1 wc -l filename | |
##### Print commands and their arguments when execute (e.g. echo `expr 10 + 20 `) | |
set -x; echo `expr 10 + 20 ` | |
##### Print some meaningful sentences to you (install fortune first) | |
fortune | |
##### Colorful (and useful) version of top (install htop first) | |
htop | |
## System | |
##### Snapshot of the current processes | |
ps | |
##### Check graphics card | |
lspci | |
##### Show IP address | |
$ip add show | |
or | |
ifconfig | |
##### Check system version | |
cat /etc/*-release | |
##### Linux Programmer's Manuel: hier- description of the filesystem hierarchy | |
man hier | |
##### List job | |
jobs -l | |
##### Export PATH | |
export PATH=$PATH:~/path/you/want | |
##### Make file execuable | |
chmod +x filename | |
# you can now ./filename to execute it | |
##### List screen | |
screen -d -r | |
##### Echo screen name | |
screen -ls | |
##### Check system (x86-64) | |
uname -i | |
##### Surf the net | |
links www.google.com | |
##### Add user, set passwd | |
useradd username | |
passwd username | |
##### Edit variable for bash, (e.g. displaying the whole path) | |
# 1. joe ~/.bash_profile | |
# 2. export PS1='\u@\h:\w\$' | |
# $PS1 is a variable that defines the makeup and style of the command prompt | |
# 3. source ~/.bash_profile | |
##### Edit environment setting (e.g. alias) | |
# 1. joe ~/.bash_profile | |
# 2. alias pd="pwd" //no more need to type that 'w'! | |
# 3. source ~/.bash_profile | |
##### List environment variables (e.g. PATH) | |
$echo $PATH | |
# list of directories separated by a colon | |
##### List all environment variables for current user | |
$env | |
##### Show partition format | |
lsblk | |
##### Soft link program to bin | |
ln -s /path/to/program /home/usr/bin | |
# must be the whole path to the program | |
##### Show hexadecimal view of data | |
hexdump -C filename.class | |
##### Jump to different node | |
rsh node_name | |
##### Check port (active internet connection) | |
netstat -tulpn | |
##### Find whick link to a file | |
readlink filename | |
##### Check where a command link to (e.g. python) | |
which python | |
##### List total size of a directory | |
du -hs . | |
or | |
du -sb | |
##### Copy directory with permission setting | |
cp -rp /path/to/directory | |
##### Store current directory | |
pushd . $popd ;dirs -l | |
##### Show disk usage | |
df -h | |
# or | |
du -h | |
# or | |
du -sk /var/log/* |sort -rn |head -10 | |
##### Show current runlevel | |
runlevel | |
##### Switch runlevel | |
init 3 | |
# or | |
telinit 3 | |
##### Permanently modify runlevel | |
1. edit /etc/init/rc-sysinit.conf | |
2. env DEFAULT_RUNLEVEL=2 | |
##### Become root | |
su | |
##### Become somebody | |
su somebody | |
##### Report user quotes on device | |
requota -auvs | |
##### Get entries in a number of important databases | |
getent database_name | |
# (e.g. the 'passwd' database) | |
getent passwd | |
# list all user account (all local and LDAP) | |
# (e.g. fetch list of grop accounts) | |
getent group | |
# store in database 'group' | |
##### Change owner of file | |
chown user_name filename | |
chown -R user_name /path/to/directory/ | |
# chown user:group filename | |
##### List current mount detail | |
df | |
##### List current usernames and user-numbers | |
cat /etc/passwd | |
##### Get all username | |
getent passwd| awk '{FS="[:]"; print $1}' | |
##### Show all users | |
compgen -u | |
##### Show all groups | |
compgen -g | |
##### Show group of user | |
group username | |
##### Show uid, gid, group of user | |
id username | |
##### Check if it's root | |
if [$(id -u) -ne 0];then | |
echo "You are not root!" | |
exit; | |
fi | |
# 'id -u' output 0 if it's not root | |
##### Find out CPU information | |
more /proc/cpuinfo | |
# or | |
lscpu | |
##### Set quota for user (e.g. disk soft limit: 120586240; hard limit: 125829120) | |
setquota username 120586240 125829120 0 0 /home | |
##### Show quota for user | |
quota -v username | |
##### Fork bomb | |
# :(){:|:&};: | |
# dont try this at home | |
##### Check user login | |
lastlog | |
##### Edit path for all users | |
joe /etc/environment | |
# edit this file | |
##### Show running processes | |
ps aux | |
##### Find maximum number of processes | |
cat /proc/sys/kernal/pid_max | |
##### Show and set user limit | |
ulimit -u | |
##### Which ports are listening for TCP connections from the network | |
nmap -sT -O localhost | |
##### Print out number of cores/ processors | |
nproc --all | |
##### Check status of each core | |
# 1. top | |
# 2. press '1' | |
##### Show jobs and PID | |
jobs -l | |
##### List all running services | |
service --status-all | |
##### Schedule shutdown server | |
shutdown -r +5 "Server will restart in 5 minutes. Please save your work." | |
##### Cancel scheduled shutdown | |
shutdown -c | |
##### Boardcast to all users | |
wall -n hihi | |
##### Kill all process of a user | |
pkill -U user_name | |
##### Set gedit preference on server | |
# -->you might have to install the following: | |
apt-get install libglib2.0-bin; | |
yum install dconf dconf-editor; | |
yum install dbus dbus-x11; | |
# -->Check list | |
gsettings list-recursively | |
# -->Change setting | |
# e.g. | |
gsettings set org.gnome.gedit.preferences.editor highlight-current-line true | |
gsettings set org.gnome.gedit.preferences.editor scheme 'cobalt' | |
gsettings set org.gnome.gedit.preferences.editor use-default-font false | |
gsettings set org.gnome.gedit.preferences.editor editor-font 'Cantarell Regular 12' | |
##### Find out who has logged in on your system | |
--> [Quick] Printing out only the names: | |
users | |
# --> [Detail] Printing out login time, load average, etc | |
w | |
##### Add user to a group (e.g add user 'nice' to the group 'docker', so that he can run docker without sudo) | |
sudo gpasswd -a nice docker | |
##### pip install python package without root | |
# 1. pip install --user package_name | |
# 2. You might need to export ~/.local/bin/ to PATH: export PATH=$PATH:~/.local/bin/ | |
##### Removing old linux kernels (when /boot almost full...) | |
# 1. uname -a #check current kernel, which should NOT be removed | |
# 2. sudo apt-get purge linux-image-X.X.X-X-generic #replace old version | |
##### Change hostname | |
sudo hostname your-new-name | |
# if not working, do also: | |
hostnamectl set-hostname your-new-hostname | |
then run: | |
hostnamectl | |
# check /etc/hostname | |
# if still not working..., edit: | |
# /etc/sysconfig/network | |
# /etc/sysconfig/network-scripts/ifcfg-ensxxx | |
# add HOSTNAME="your-new-hostname" | |
##### List installed packages | |
apt list --installed | |
# or Red Hat: | |
yum list installed | |
##### Tutorial for setting up your own DNS server | |
# http://onceuponmine.blogspot.tw/2017/08/set-up-your-own-dns-server.html | |
##### Tutorial for creating a simple daemon | |
# http://onceuponmine.blogspot.tw/2017/07/create-your-first-simple-daemon.html | |
# =-=-=-=-=-A lot more coming!! =-=-=-=-=-=-=-=-=-=waitwait-=-=-=-=-=-=-=-=-=- |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment