The document provides tips for command line users to help them achieve more with less typing. It encourages moving beyond being a "rookie" and taking command by learning tricks like using pipes to parallelize processes, taking advantage of tools like find, grep, and sed, and leveraging the readline functionality built into most command line interfaces.
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Don't be a GUI rookie forever - Be in command! (line)
1. Don’t be a rookie forever.
Be in command! (line)
Giuseppe Maxia
@datacharmer
$
This work is licensed under the Creative Commons Attribution-Share Alike 3.0 Unported License.
Sunday, August 21, 11
2. about me -Giuseppe Maxia
§ a.k.a. The Data Charmer
§ QA Director, Continuent, Inc
§ Long time hacking with database features
§ Formerly, database consultant, designer, coder.
§ A passion for QA
§ An even greater passion for open source
§ ... and community
§ Passionate blogger
§ http://datacharmer.blogspot.com
Sunday, August 21, 11
3. What this tutorial is about
§ Providing tools and tips for command line users;
§ Learn a few tricks to make you achieve more and type
less.
Sunday, August 21, 11
4. What this tutorial is about
§ Providing tools and tips for command line users;
§ Learn a few tricks to make you achieve more and type
less.
§ Making GUI enthusiasts green with envy;
bar
foo
baz
Sunday, August 21, 11
5. This tutorial
§ A quick guide at the command line usage
§ A practical case for database admins
§ but ...
§ Useful for all
Sunday, August 21, 11
6. Problem
§ One document contains one date in 'mm/dd/yyyy'
format
§ Need to convert the date into the 'yyyy-mm-dd' format
(or dd.mm.yyyy)
GUI USER SOLUTION
§ open the document with a word processor
§ change the date
§ Command line USER SOLUTION
§ Probably the same
Sunday, August 21, 11
7. Problem
§ One document contains many dates in 'mm/dd/yyyy'
format
§ Need to convert the dates into the 'yyyy-mm-dd'
format (or dd.mm.yyyy)
GUI USER SOLUTION
§ open the document with an advanced word processor
§ hope it supports regular expressions
§ Command line USER SOLUTION
§ Use vi or emacs. Do a search-and-replace operation
§ Or use the next page solution
Sunday, August 21, 11
8. Problem
§ Many documents contain many dates in 'mm/dd/yyyy'
format
§ Need to convert the dates in all documents into the
'yyyy-mm-dd' format (or dd.mm.yyyy)
GUI USER SOLUTION
§ Realizes that it will take days to do this manually
§ Scream
§ Command Line USER SOLUTION
§ uses sed or perl to do the replacement in one line
Sunday, August 21, 11
10. An educational story
1985-90
1991
1993
1994
1995-97
1998-99
2000-2001
2001-2006
2007-2009
2010-
9
Sunday, August 21, 11
11. An educational story
1985-90 • MS-DOS
1991
1993
1994
1995-97
1998-99
2000-2001
2001-2006
2007-2009
2010-
9
Sunday, August 21, 11
12. An educational story
1985-90 • MS-DOS
1991 • Windows 3.0
1993
1994
1995-97
1998-99
2000-2001
2001-2006
2007-2009
2010-
9
Sunday, August 21, 11
13. An educational story
1985-90 • MS-DOS
1991 • Windows 3.0
1993 • Windows 3.1
1994
1995-97
1998-99
2000-2001
2001-2006
2007-2009
2010-
9
Sunday, August 21, 11
14. An educational story
1985-90 • MS-DOS
1991 • Windows 3.0
1993 • Windows 3.1
1994 • Windows NT
1995-97
1998-99
2000-2001
2001-2006
2007-2009
2010-
9
Sunday, August 21, 11
15. An educational story
1985-90 • MS-DOS
1991 • Windows 3.0
1993 • Windows 3.1
1994 • Windows NT
1995-97 • Windows 95
1998-99
2000-2001
2001-2006
2007-2009
2010-
9
Sunday, August 21, 11
16. An educational story
1985-90 • MS-DOS
1991 • Windows 3.0
1993 • Windows 3.1
1994 • Windows NT
1995-97 • Windows 95
1998-99 • Windows 98
2000-2001
2001-2006
2007-2009
2010-
9
Sunday, August 21, 11
17. An educational story
1985-90 • MS-DOS
1991 • Windows 3.0
1993 • Windows 3.1
1994 • Windows NT
1995-97 • Windows 95
1998-99 • Windows 98
2000-2001 • Windows 2000
2001-2006
2007-2009
2010-
9
Sunday, August 21, 11
18. An educational story
1985-90 • MS-DOS
1991 • Windows 3.0
1993 • Windows 3.1
1994 • Windows NT
1995-97 • Windows 95
1998-99 • Windows 98
2000-2001 • Windows 2000
2001-2006 • Windows XP
2007-2009
2010-
9
Sunday, August 21, 11
19. An educational story
1985-90 • MS-DOS
1991 • Windows 3.0
1993 • Windows 3.1
1994 • Windows NT
1995-97 • Windows 95
1998-99 • Windows 98
2000-2001 • Windows 2000
2001-2006 • Windows XP
2007-2009 • Windows Vista
2010-
9
Sunday, August 21, 11
20. An educational story
1985-90 • MS-DOS
1991 • Windows 3.0
1993 • Windows 3.1
1994 • Windows NT
1995-97 • Windows 95
1998-99 • Windows 98
2000-2001 • Windows 2000
2001-2006 • Windows XP
2007-2009 • Windows Vista
2010- • Windows 7
9
Sunday, August 21, 11
21. An educational story
1985-90 • MS-DOS • Unix shell
1991 • Windows 3.0
1993 • Windows 3.1 • Linux
1994 • Windows NT
1995-97 • Windows 95
1998-99 • Windows 98
2000-2001 • Windows 2000
2001-2006 • Windows XP • Mac OSX
2007-2009 • Windows Vista
2010- • Windows 7
9
Sunday, August 21, 11
22. Why the command line
• portability
• efficiency
• fun
10
Sunday, August 21, 11
23. the command line (for rookies)
||||
NO
PANIC 11
Sunday, August 21, 11
27. The shell
• It's a command interpreter
• There are many flavors
> bash
> zsh
> ksh
14
Sunday, August 21, 11
28. MySQL command line client
• called "mysql"
> Takes SQL commands
> sends them to the server
> gets results
• but it can do much more ...
15
Sunday, August 21, 11
29. other tools
• Shell scripts
• Aliases
• Perl
• awk
• sort
• …. and a lot of Unix little helper
16
Sunday, August 21, 11
30. other tools
• Shell scripts
• Aliases
• Perl which could replace everything else, of course
• awk
• sort
• …. and a lot of Unix little helper
16
Sunday, August 21, 11
31. in case it wasn't clear (yeah, for
rookies)
17
Sunday, August 21, 11
32. in case it wasn't clear (yeah, for
rookies)
• command line actions are
17
Sunday, August 21, 11
33. in case it wasn't clear (yeah, for
rookies)
• command line actions are
> commands (the name of the application to invoke)
17
Sunday, August 21, 11
34. in case it wasn't clear (yeah, for
rookies)
• command line actions are
> commands (the name of the application to invoke)
> parameters (optional arguments for the application)
17
Sunday, August 21, 11
35. in case it wasn't clear (yeah, for
rookies)
• command line actions are
> commands (the name of the application to invoke)
> parameters (optional arguments for the application)
> and the ENTER key
17
Sunday, August 21, 11
36. in case it wasn't clear (yeah, for
rookies)
• command line actions are
> commands (the name of the application to invoke)
> parameters (optional arguments for the application)
> and the ENTER key
Enter
17
Sunday, August 21, 11
37. The Unix philosophy (1)
• One tool for every feature
> make one tool that does one thing well
> for many features, make many tools
> make them work together (see next slide)
18
Sunday, August 21, 11
38. The Unix philosophy (2)
• To make several tool cooperate:
> pipe the output of one tool to the input of another one.
> for more actions, pipe more tools
$ sort < filename | uniq | nl
19
Sunday, August 21, 11
60. readline
• Common component
> shell
> mysql client
> many CLI applications
29
Sunday, August 21, 11
61. Main cursor movements
Ctrl A Start/End of line
Ctrl E
Meta B Back/Forward one word
Meta F
previous/next command
Ctrl L clear screen and take
current line on top
Ctrl R Search history
30
Sunday, August 21, 11
62. Changing text
Meta U Uppercase word
Meta L Lowercase word
Ctrl D delete word
Ctrl K delete to end of line
Ctrl - undo
for more tips:
$ man readline 31
Sunday, August 21, 11
63. Some conventions in this talk
$ command
at the shell
mysql> command
at the mysql prompt
32
Sunday, August 21, 11
64. The command line friends
#!
handy
Sunday, August 21, 11
tools
33
65. your best friends at the command line
• man
• ls
• cd
• find
• grep
• date
• echo
• pwd
• mv
34
• cp
Sunday, August 21, 11
66. man {command_name}
• Tells you how to use a command
man ls
35
Sunday, August 21, 11
67. ls [directory]
• lists contents of current [or given] directory
ls
ls /some/path
ls *.txt
36
Sunday, August 21, 11
68. cd [directory]
• change directory to given path
• takes to $HOME directory if no path is given
cd /some/path
cd ..
37
Sunday, August 21, 11
69. find {directory} [conditions]
• finds files in the given directory that satisfy conditions
find $HOME/docs -name "*mouse*"
38
Sunday, August 21, 11
71. date [layout]
• displays the current date and time, with optional layout
date
Tue Aug 16 08:33:04 CEST 2011
date '+%Y-%m-%d'
2011-08-16
40
Sunday, August 21, 11
72. echo "message"
• displays the given message and/or variables
echo "hi"
hi
GREETINGS='Hello, there!'
echo $GREETINGS
Hello, there!
41
Sunday, August 21, 11
73. pwd
• displays the current path (Print Working Directory
pwd
/home/gmax/test_dir
42
Sunday, August 21, 11
74. mv old_file_name new_file_name
• moves a file from one place to another
• renames a file
mv ugly.txt /some/other/path
mv *.txt /storage/texts
mv ugly.txt beautiful.txt
43
Sunday, August 21, 11
75. cp file_name destination
• copies a file from one place to another
• creates a copy of a file
cp ugly.txt /some/other/path
cp *.txt /storage/texts
cp ugly.txt beautiful.txt
44
Sunday, August 21, 11
76. other important friends at the
command line
• rm
• mkdir
• rmdir
• cat
• sed
• strings
• wc
• head
• tail
• more/less 45
• sort
Sunday, August 21, 11
78. mkdir/rmdir directory
• creates or removes a directory
mkdir mydir
rmdir mydir
47
Sunday, August 21, 11
79. cat
• shows the contents of a file
cat addresses.txt
48
Sunday, August 21, 11
80. sed [option] file
• performs editing on a file
sed -e 's/Ship/Airplane/' travel.txt
49
Sunday, August 21, 11
81. strings filename
• extracts printable text from a file
strings /bin/ls
50
Sunday, August 21, 11
82. wc filename
• counts words (and characters and lines) in a file
wc .bashrc
72 164 2842 .bashrc
# (lines, words, characters)
51
Sunday, August 21, 11
83. head/tail filename
• display the first or the last lines of a file
head long_file.txt
head -n 5 long_file.txt
tail long_file.txt
tail -n 1 long_file.txt
52
Sunday, August 21, 11
84. more/less filename
• display a file with scrollable pages
# old: inefficient
more filename.txt
# new: preferred
less filename.txt
53
Sunday, August 21, 11
85. sort filename
• displays the ordered contents of a filename
sort unordered.txt
sort unordered.txt > sorted.txt
54
Sunday, August 21, 11
97. I speak
Perl
with a hint of a C
accent
Sunday, August 21, 11
98. I speak
French
and
Spanish
Sunday, August 21, 11
99. I speak
French
and
Spanish
but since I use
them very little,
they have melted
with Italian and
English
Sunday, August 21, 11
100. I speak
#!/bin/bash
Bash
Sunday, August 21, 11
101. I speak
#!/bin/bash
Bash
with a strong
Perl accent
Sunday, August 21, 11
102. I speak fluent Italian
La donzelletta vien dalla
campagna, in sul calar del
sole, col suo fascio dell'erba
e reca in mano un mazzolino
di rose e viole, onde, siccome
suole, ornare ella si appresta ...
Sunday, August 21, 11
103. However, Sardinian comes handy sometimes
Maissavida
ti frimisti! (*)
(*) May you never stop
Sunday, August 21, 11
104. I speak fluent English
When in the Course of human events, it becomes
necessary for one people to dissolve the political bands
which have connected them with another, and to assume
among the powers of the earth, the separate and equal
station to which the Laws of Nature and of Nature's God
entitle them, a decent respect to the opinions of mankind
requires that they should declare the causes which impel
them to the separation.
Sunday, August 21, 11
105. I speak fluent English
When in the Course of human events, it becomes
necessary for one people to dissolve the political bands
which have connected them with another, and to assume
among the powers of the earth, the separate and equal
station to which the Laws of Nature and of Nature's God
entitle them, a decent respect to the opinions of mankind
requires that they should declare the causes which impel
them to the separation.
hmm.
wrong
flag
Sunday, August 21, 11
106. I speak fluent English
When in the Course of human events, it becomes
necessary for one people to dissolve the political bands
which have connected them with another, and to assume
among the powers of the earth, the separate and equal
station to which the Laws of Nature and of Nature's God
entitle them, a decent respect to the opinions of mankind
requires that they should declare the causes which impel
them to the separation.
Sunday, August 21, 11
107. But sometimes Italian is still necessary
barista al fresco pasta
maestro espresso tempo
vendetta soprano finale piano
dilettante cappuccino stucco
stiletto virtuoso fiasco presto lotto
pizza bravo lasagna
studio spaghetti
stanza
Sunday, August 21, 11
108. And sometimes Italian is needed
I tuoi perversi
defunti!(*)
(*) Your wicked ancestors!
Sunday, August 21, 11
109. Although Sardinian is still effective here
Ancu ti currullidi
sa giustizia (*)
(*) May the rule of law chase you
Sunday, August 21, 11
110. I speak Perl fluently
#!/usr/bin/perl
use strict;
use warnings;
use File::Find;
while (my $line = <stdin>){
# …
Sunday, August 21, 11
111. Sometimes, I need help from C
use Inline C;
print "9 + 16 = ", add(9, 16), "n";
__END__
__C__
int add(int x, int y) {
return x + y;
}
Sunday, August 21, 11
112. Most of my work at the command line is Bash
$ for D in $HOME/*/; do du -sh $D;
> done > /tmp/occupancy
#!/bin/bash
Sunday, August 21, 11
113. And sometimes, a pinch of Perl can help
$ perl -pe
's{(dd)-(dd)-(dddd)}{$3-$1-$2}g'
< rawfile.txt > betterfile.txt
#!/bin/bash
Sunday, August 21, 11
114. And then on top of all this, I need to speak SQL
$ mysql -e
'SELECT COUNT(*) FROM dbname.tbl_name
WHERE col_name = 1 and other_col="A" '
Sunday, August 21, 11
115. I wish I could say that my SQL has a Perlish
accent
$ mysql -e
'SELECT COUNT(*) FROM dbname.tbl_name
WHERE col_name = 1 and other_col="A" '
use strict;
use DBI;?
Sunday, August 21, 11
116. I wish I could say that my SQL has a Perlish
accent
$ mysql -e
'SELECT COUNT(*) FROM dbname.tbl_name
WHERE col_name = 1 and other_col="A" '
but it wouldn't be true
Sunday, August 21, 11
117. I could curse in Perl
$ perl -pe
's{(dd)-(dd)-(ddd
d)}{$3-$1-$2}g'
< rawfile.txt >
betterfile.txt (*)
But it would not
get me far.
(*) already translated
Sunday, August 21, 11
130. nesting variables
# t.sh
CMD="SELECT TABLE_NAME"
TBL='information_schema.tables'
WHC1="TABLE_SCHEMA='mysql'"
WHC2="TABLE_NAME like 'u%' "
Q1="$CMD FROM $TBL"
Q2="WHERE $WHC1 AND $WHC2"
Q="$Q1 $Q2"
echo $Q
echo $Q | mysql
87
Sunday, August 21, 11
131. nesting variables
$ sh t.sh
SELECT TABLE_NAME FROM
information_schema.tables WHERE
TABLE_SCHEMA='mysql' AND TABLE_NAME like
'u%'
TABLE_NAME
user
88
Sunday, August 21, 11
133. SQL commands from a file
$ mysql < filename.sql
mysql> source filename.sql
• executes the commands contained in
filename.sql
• commands can be queries understood
by the server
• and commands for the client
90
Sunday, August 21, 11
134. SQL commands at the command line
$ application | mysql
$ echo "SELECT 1" | mysql
$ mysql -e "SELECT 1"
• executes the commands from standard
input
• commands can be queries understood
by the server
• and commands for the client
91
Sunday, August 21, 11
135. batch mode
$ echo "select curdate()" | mysql
curdate()
2010-04-12
92
Sunday, August 21, 11
138. Forcing batch mode
mysql -B -e 'select curdate()'
curdate()
2010-04-12
95
Sunday, August 21, 11
139. Forcing batch mode - no header
mysql -N -B -e 'select curdate()'
2010-04-12
ANT!
PO RT
IM
96
Sunday, August 21, 11
140. Shell + mysql
$ echo "The current server's date is
`mysql -N -B -e 'select curdate()'`."
$ echo "The current server's date is
$(mysql -N -B -e 'select
curdate()')."
97
Sunday, August 21, 11
142. loops basics
$ for N in 1 2 3
> do
> echo $N
> done
1
2
3
99
Sunday, August 21, 11
143. loops basics
$ for N in 1 2 3 ; do echo $N ; done
1
2
3
100
Sunday, August 21, 11
144. loops basics
$ for N in $(seq 1 3) ;
do echo "this is number $N" ;
done
this is number 1
this is number 2
this is number 3
101
Sunday, August 21, 11
145. loops from file
$ head /usr/share/dict/words
A
a
aa
aal
aalii
aam
Aani
aardvark
aardwolf
102
Sunday, August 21, 11
146. loops from file
$ for U in
$(head /usr/share/dict/words ) ; do
perl -le 'print uc shift' $U ; done
A
A
AA
AAL
AALII
AAM
AANI
103
Sunday, August 21, 11
147. loops from mysql results
$ mysql -B -N -e 'show tables from
world'
City
Country
CountryLanguage
104
Sunday, August 21, 11
148. loops from mysql results
$ for T in $(mysql -B -N -e 'show
tables from world') ;
> do echo "CREATE TABLE world2.$T
LIKE world.$T;" ; done
CREATE TABLE world2.City LIKE
world.City;
CREATE TABLE world2.Country LIKE
world.Country;
CREATE TABLE world2.CountryLanguage
LIKE world.CountryLanguage;
105
Sunday, August 21, 11
149. piping loops back into mysql
$ for T in $(mysql -B -N -e 'show
tables from world') ;
> do echo "CREATE TABLE world2.$T
LIKE world.$T;" ; done
> | mysql -vv
106
Sunday, August 21, 11
151. doing something for every table
in every database
$ mysql -e "show databases"
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| sakila |
| world |
+--------------------+
108
Sunday, August 21, 11
152. doing something for every table
in every database
$ mysql -e "show tables from world"
+-----------------+
| Tables_in_world |
+-----------------+
| City |
| Country |
| CountryLanguage |
+-----------------+
109
Sunday, August 21, 11
154. actual code
alias mybatch='mysql -B -N'
for D in $(mybatch -e "SHOW SCHEMAS")
do
for T in
$(mybatch -e "SHOW TABLES FROM $D")
do
echo "$D.$T"
done
done
111
Sunday, August 21, 11
157. Custom option files
$ mysql --no-defaults
$ mysql --defaults-file=filename
$ mysql --defaults-extra-file=filename
114
Sunday, August 21, 11
158. Option files sections
[mysqld]
# option for server
[client]
# option for any mysql client
[mysql]
# options specific to 'mysql' CLI app
115
Sunday, August 21, 11
165. Another useful alias
alias mybatch='mysql -B -N '
mybatch -e "select version()"
5.1.45-log
122
Sunday, August 21, 11
166. ( )
advanced command line techniques
((((((
(:
@ @
-
#!
functions
123
Sunday, August 21, 11
167. functions
• like aliases, but with parameters
124
Sunday, August 21, 11
168. sample function
function grant_new {
mysql_as_root -e
"GRANT $1 on $2 to $3 identified
by "$4" "
}
$ grant_new SELECT "world.*" john
john_secret
125
Sunday, August 21, 11
169. sample function
$ mysql_as_root
-e 'show grants for johnG'
*** 1. row ***
Grants for john@%: GRANT USAGE ON *.*
TO 'john'@'%' IDENTIFIED BY PASSWORD
'*73A88CE13374128844E3ABB500F439A9C02C
53A3'
*** 2. row ***
Grants for john@%: GRANT SELECT ON
`world`.* TO 'john'@'%'
126
Sunday, August 21, 11
171. which query is being executed?
# wrong.sql
# this script has one error
use test ;
drop table if exists t1 ;
create table t1 (id int);
insert into t1 values (a);
128
Sunday, August 21, 11
172. which query is being executed?
$ mysql < wrong.sql
ERROR 1054 (42S22) at line 4: Unknown
column 'a' in 'field list'
# WHERE IS THE ERROR?
129
Sunday, August 21, 11
173. which query is being executed?
$ mysql -v < wrong.sql
--------------
drop table if exists t1
--------------
--------------
create table t1 (id int)
--------------
--------------
insert into t1 values (a)
--------------
ERROR 1054 (42S22) at line 4: Unknown column
'a' in 'field list'
130
Sunday, August 21, 11
174. getting execution times
$ mysql -vv -e
'select rating,count(*) from sakila.film
group by rating'
+--------+----------+
| rating | count(*) |
+--------+----------+
| G | 178 |
| PG | 194 |
| PG-13 | 223 |
| R | 195 |
| NC-17 | 210 |
+--------+----------+
5 rows in set (0.00 sec) 131
Sunday, August 21, 11
175. getting execution times (batch mode)
$echo 'select rating,count(*) from sakila.film group
by rating' | mysql -vv
--------------
select rating,count(*) from sakila.film group by
rating
--------------
rating count(*)
G 178
PG 194
PG-13 223
R 195
NC-17 210
5 rows in set
132
Sunday, August 21, 11
176. getting execution times (batch mode)
$ echo 'select rating,count(*) from sakila.film group
by rating' | mysql -vvv
--------------
select rating,count(*) from sakila.film group by
rating
--------------
+--------+----------+
| rating | count(*) |
+--------+----------+
| G | 178 |
| PG | 194 |
| PG-13 | 223 |
| R | 195 |
| NC-17 | 210 |
+--------+----------+
133
5 rows in set (0.00 sec)
Sunday, August 21, 11
177. advanced command line techniques
getting
_$
distinct
results134
Sunday, August 21, 11
178. getting a single value
$ mysql -e "show variables like 'port'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port | 3306 |
+---------------+-------+
# Here, we only want the port number
135
Sunday, August 21, 11
179. getting a single value
$ mysql -NB -e "show variables like 'port'"
port 3306
# no header, batch mode
# still two values
136
Sunday, August 21, 11
180. getting a single value
$ mysql -NB
-e "show variables like 'port'"
| awk '{print $2}'
3306
$ mysql -NB
-e "show variables like 'port'"
| perl -lane 'print $F[1]'
3306
# filtering the wanted value
137
Sunday, August 21, 11
181. getting a single value: is replication
working?
$ mysql
-e "show slave status G"
| grep -i slave_io_running
Slave_IO_Running: Yes
# too many things.
# We only want a 'yes' or 'no'
138
Sunday, August 21, 11
182. getting a single value: is replication
working?
$ mysql
-e "show slave status G"
| grep -i "slave_io_running"
| perl -lane 'print $F[1]'
Yes
# yes!
139
Sunday, August 21, 11
185. Perl command line must-know facts (1)
perl -e 'print "hellon"'
# executes perl code
141
Sunday, August 21, 11
186. Perl command line must-know facts (2)
perl -ne 'print if /^a/'
# starts a loop from standard input
# and executes the perl code for each
# iteration
perl -MO=Deparse -ne 'print if /^a/'
LINE: while (defined($_ = <ARGV>)) {
print $_ if /^a/;
}
142
Sunday, August 21, 11
187. Perl command line must-know facts (3)
perl -pe 's/(^aw+)/$1/'
# like -ne, but prints each line
$ perl -MO=Deparse -pe 's/(^aw+)/$1/'
LINE: while (defined($_ = <ARGV>)) {
s/(^aw+)/$1/;
}
continue {
print $_;
}
143
Sunday, August 21, 11
188. Perl command line must-know facts (4)
perl -le 'print "hello"'
# strips newlines from input and adds
# them to output
$ perl -e 'print "hello"'
hello$
$ perl -le 'print "hello"'
hello
$
144
Sunday, August 21, 11
189. Perl command line must-know facts (5)
perl -lane 'print $F[0]'
# splits input into @F array
$ echo "a b c" |
perl -lane 'print $F[1]'
b
$ echo "a b c" |
perl -lane 'print $F[2]'
c
145
Sunday, August 21, 11
190. Perl command line must-know facts (6)
Perl and shell contention for $
#!/bin/bash
Take the $$$ and run
146
Sunday, August 21, 11
191. Beware of $VARIABLES on the
command line
$ perl -le "$x=1; print $x"
syntax error at -e line 1, near "="
Execution of -e aborted due to
compilation errors.
147
Sunday, August 21, 11
192. double quotes
Beware of $VARIABLES on theconsumed by the
allow the shell to
shell, before Perl
interpolate
command line can see it
variables
$ perl -le "$x=1; print $x"
syntax error at -e line 1, near "="
Execution of -e aborted due to
compilation errors.
147
Sunday, August 21, 11
193. double quotes
Beware of $VARIABLES on theconsumed by the
allow the shell to
shell, before Perl
interpolate
command line can see it
variables
$ perl -le "$x=1; print $x"
syntax error at -e line 1, near "="
Execution of -e aborted due to
compilation errors.
consumed by the
shell, before Perl
can see it
147
Sunday, August 21, 11
194. double quotes
Beware of $VARIABLES on the consumed by the
allow the shell to
shell, before Perl
interpolate
command line can see it
variables
$ perl -le "$x=1; print $x"
syntax error at -e line 1, near "="
Execution of -e aborted due to
compilation errors.
consumed by the
shell, before Perl
$ perl -le '$x=1; print $x' can see it
1
147
Sunday, August 21, 11
195. double quotes
Beware of $VARIABLES on the consumed by the
allow the shell to
shell, before Perl
interpolate
command line can see it
variables
$ perl -le "$x=1; print $x"
syntax error at -e line 1, near "="
Execution of -e aborted due to
compilation errors.
consumed by the
shell, before Perl
$ perl -le '$x=1; print $x' can see it
1
single quotes the
consumed by
prevent variable
shell, before Perl
consumption by
can shell it
the see147
Sunday, August 21, 11
197. combining column names
$ mysql -N -e 'desc world.City'
+-------------+----------+----+-----+
| ID | int(11) | NO | PRI |
| Name | char(35) | NO | |
| CountryCode | char(3) | NO | |
| District | char(20) | NO | |
| Population | int(11) | NO | |
+-------------+----------+----+-----+
149
Sunday, August 21, 11
198. combining column names
# Expected result:
# SELECT CONCAT_WS('|',
# ID,Name,CountryCode,District,
# Population) from City
150
Sunday, August 21, 11
200. combining column names (II)
echo "select concat_ws('|', $(
mysql -NB -e 'select
group_concat(column_name) from
information_schema.columns where
table_name="City" and
table_schema="world"')) from
world.City"
select concat_ws('|',
ID,Name,CountryCode,District,Populatio
n) from world.City
152
Sunday, August 21, 11
201. combining column names (IIa)
echo "select concat_ws('|', $(
mysql -NB -e 'select
group_concat(column_name) from
information_schema.columns where
table_name="Country" and
table_schema="world"')) from
world.Country"
select concat_ws('|',
Code,Name,Continent,Region,SurfaceArea,Inde
pYear,Population,LifeExpectancy,GNP,GNPOld,
LocalName,GovernmentForm,HeadOfState,Capita
l,Code2) from world.Country 153
Sunday, August 21, 11
202. piping the result back to mysql
echo "select concat_ws('|', $(
mysql -NB -e 'select
group_concat(column_name) from
information_schema.columns where
table_name="Country" and
table_schema="world"')) as line from
world.Country" | mysql | head -n 4
line
AFG|Afghanistan|Asia|Southern and Central Asia|652090.00|1919|
22720000|45.9|5976.00|Afganistan/Afqanestan|Islamic Emirate|
Mohammad Omar|1|AF
NLD|Netherlands|Europe|Western Europe|41526.00|1581|15864000|
78.3|371362.00|360478.00|Nederland|Constitutional Monarchy|
Beatrix|5|NL
ANT|Netherlands Antilles|North America|Caribbean|800.00|217000|
74.7|1941.00|Nederlandse Antillen|Nonmetropolitan Territory of
154
The Netherlands|Beatrix|33|AN
Sunday, August 21, 11
205. dumping a tab delimited data set
# the naive way
$ mysql
-e "SELECT *
into outfile '/tmp/city_data'
from world.City"
# it works only if:
# - /tmp/city_data does not exist
# - /tmp is world writable
156
Sunday, August 21, 11
206. dumping a tab delimited data set
$ mysql -B -N
-e "SELECT * from world.City"
> /tmp/city_data
# it works always
# if you omit the "-N" it also
# includes a header
157
Sunday, August 21, 11
207. dumping a CSV
$ mysql -B
-e "SELECT * from world.City"
| perl -F"t" -lane
'print join ",",
map {s/"/""/g;
/^[d.]+$/ ? $_ : qq("$_")}
@F '
> /tmp/city_data
158
Sunday, August 21, 11
208. dumping a CSV
$ mysql -B
-e "SELECT * from world.City"
| perl -F"t" -lane
'print join ",", splits the line by tabs, instead
map {s/"/""/g; of the default whitespace
/^[d.]+$/ ? $_ : qq("$_")}
@F '
> /tmp/city_data
158
Sunday, August 21, 11
210. use the mysql.sh script
§ The companion code for this tutorial
§ http://tinyurl.com/cli-tut-code-2010
§ It will save you much typing
§ But use it at your own risk!
160
Sunday, August 21, 11
211. Usage
• download the script
• load it
$ source mysql.sh
161
Sunday, August 21, 11
212. mysql.sh functions
• my_batch "query"
• returns the result of the query.
• Without header
• Without box
$ my_batch "SELECT * FROM test.t1"
1 aaa
2 bbb
3 ccc
162
Sunday, August 21, 11
213. mysql.sh functions
• my_value "what"
• returns a single value
• e.g.
$ my_value "version()"
5.1.49
$ my_value "@@server_id"
1
163
Sunday, August 21, 11
214. mysql.sh functions
• my_var "what"
• returns the value of a given variable
• e.g.
$ my_var port
3306
$ my_var datadir
/usr/local/mysql/data
164
Sunday, August 21, 11
215. mysql.sh functions
• my_status "what"
• returns the value of a given status item
• e.g.
$ my_status com_select
2653
$ my_status connections
452
165
Sunday, August 21, 11
216. mysql.sh functions
• my_dump_dataset "query" [header]
• returns the values of a given query separated by tabs
• if a header is requested, it will be part of the result
• e.g.
$ my_dump_dataset "select * from
world.City" | head -n 5
1 Kabul AFG Kabol 1780000
2 Qandahar AFG Qandahar 237500
3 Herat AFG Herat 186800
4 Mazar-e-Sharif AFG Balkh 127800
166
5 Amsterdam NLD Noord-Holland 731200
Sunday, August 21, 11
217. mysql.sh functions
• my_csv "query" [separator]
• returns the values of a given query separated by
commas, or by a given separator
• e.g.
$ my_csv 'select * from world.City' |
head -n 3
"ID","Name","CountryCode","District","
Population"
1,"Kabul","AFG","Kabol",1780000
2,"Qandahar","AFG","Qandahar",237500
167
Sunday, August 21, 11
218. inside the command line client
handling
:-)
@ @
$_
output
168
Sunday, August 21, 11
219. pager
mysql> SELECT * FROM world.City;
rec …
rec …
rec …
4000 + records
unreadable
169
Sunday, August 21, 11
220. pager
mysql> pager less
PAGER set to 'less'
mysql> SELECT * FROM world.City;
# [ records in a manageable window ]
mysql> nopager
PAGER set to stdout
# back to normal
170
Sunday, August 21, 11
221. More pager tricks
mysql> pager vim -
# like 'less', but you can also edit
# the results and eventually save
# them
171
Sunday, August 21, 11
222. More pager tricks
mysql> pager md5sum
PAGER set to 'md5sum'
mysql> select * from City;
5d17ffa50d6da200dee621823ade2543 -
4079 rows in set (0.01 sec)
# produce a CRC for the result set
# instead of displaying it.
# Useful for data comparison.
# (Thanks to Baron Schwartz
172
Sunday, August 21, 11
223. Comparing data sets with md5sum
mysql> select * from City;
5d17ffa50d6da200dee621823ade2543 -
mysql> select * from City order by ID;
5d17ffa50d6da200dee621823ade2543 -
mysql> select * from City order by name;
5ab980f5b69a6e65d3b8cd5a95ec94e0 -
mysql> select * from City order by
District;
2bf37cbe91b3ffeaebc8c4b6084b8784 - 173
Sunday, August 21, 11
224. Comparing data sets with md5sum
mysql> select * from City;
5d17ffa50d6da200dee621823ade2543 -
mysql> select * from City order by ID;
5d17ffa50d6da200dee621823ade2543 -
mysql> select * from City order by name;
5ab980f5b69a6e65d3b8cd5a95ec94e0 -
mysql> select * from City order by
District;
2bf37cbe91b3ffeaebc8c4b6084b8784 - 173
Sunday, August 21, 11
225. More pager tricks
mysql> pager cat > /tmp/t1.txt
mysql> select "one" union select
"two";
mysql> pager cat > /tmp/t2.txt
mysql> select "one" union select
"TWO";
mysql> nopager
mysql> ! vimdiff -o /tmp/t[12].txt
# see the difference between two
# datasets
174
Sunday, August 21, 11
227. logging sessions
mysql> tee mylog.txt
# logs everything that you see on
# the screen.
# your commands, the results,
# warnings, error messages, and so on.
mysql> notee
# back to normal
176
Sunday, August 21, 11
228. read more
§ http://datacharmer.blogspot.com
Sunday, August 21, 11
229. THANKS!
?
Question
time
Comments on Twitter:
@datacharmer
This work is licensed under the Creative Commons Attribution-Share Alike 3.0 Unported License.
Sunday, August 21, 11
230. to do
§ add dead languages
§ comparing Latin and ancient Greek to COBOL and
Pascal
§ add new tricks
§ {x,y} expansion in bash
§ G in MySQL
§
Sunday, August 21, 11