////
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
////

.Common arguments
[grid="all"]
`----------------------------------------`-------------------------------------
Argument                                  Description
-------------------------------------------------------------------------------
+\--connect <hostname>+                   Specify mainframe host to connect
+\--connection-manager <class-name>+      Specify connection manager class to\
                                          use
+\--hadoop-mapred-home <dir>+             Override $HADOOP_MAPRED_HOME
+\--help+                                 Print usage instructions
+\--password-file+                        Set path for a file containing the\
                                          authentication password
+-P+                                      Read password from console
+\--password <password>+                  Set authentication password
+\--username <username>+                  Set authentication username
+\--verbose+                              Print more information while working
+\--connection-param-file <filename>+     Optional properties file that\
                                          provides connection parameters
-------------------------------------------------------------------------------
