<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://github.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://github.com/" rel="alternate" type="text/html" /><updated>2026-07-28T20:26:21+00:00</updated><id>https://github.com/feed.xml</id><title type="html">Muthukamalan</title><subtitle>Some days I patch bugs in the ml pipeline code, other days I patch feelings with a stanza.</subtitle><author><name>Muthu Kamalan</name></author><entry><title type="html">GPU LLM Inference</title><link href="https://github.com/blog/gpu-llm-inference/" rel="alternate" type="text/html" title="GPU LLM Inference" /><published>2026-07-27T00:00:00+00:00</published><updated>2026-07-27T00:00:00+00:00</updated><id>https://github.com/blog/gpu-llm-inference</id><content type="html" xml:base="https://github.com/blog/gpu-llm-inference/"><![CDATA[<h1 id="1-overview">1. Overview</h1>
<p>Large LLMs like Llama-3-70b or Falcon 180B may not fit in a single GPU.</p>

<p>If training/serving a model on a single GPU is too slow or if the model’s weights do not fit in a single GPU’s memory, transitioning to a multi-GPU setup may be a viable option.</p>

<p>But serving large language models (LLMs) with multiple GPUs in a distributed environment might be a challenging task.</p>

<h1 id="2-checking-the-model-footprint-of-the-model">2. Checking the Model Footprint of the Model</h1>
<p>Before deploying a model in a distributed environment, it is important to check the memory footprint of the model.</p>

<p>To begin estimating how much vRAM is required to serve your LLM, we can use these tools:</p>

<ul>
  <li><a href="https://huggingface.co/spaces/hf-accelerate/model-memory-usage">HF Model Memory Usage</a></li>
  <li><a href="https://rahulschand.github.io/gpu_poor/">GPU Poor vRAM Calculator</a></li>
  <li><a href="https://huggingface.co/spaces/NyxKrage/LLM-Model-VRAM-Calculator">LLM Model VRAM Calculator</a> only for quantization models</li>
  <li><a href="https://llm.extractum.io/">LLM Explorer</a> to check raw model vRAM size consumption</li>
</ul>

<!-- https://github.com/rh-aiservices-bu/gpu-partitioning-guide#14-pros-and-cons-of-gpu-partitioning-methods -->
<!-- https://github.com/rh-aiservices-bu/multi-gpu-llms#1-overview -->
<h1 id="3-gpu-partitioning-overview">3. GPU Partitioning Overview</h1>
<p><img src="https://github.com/rh-aiservices-bu/gpu-partitioning-guide/raw/main/assets/gpu-sharing-overview.png" alt="Overview" /></p>
<h2 id="time-slicing">Time-slicing</h2>
<h2 id="mig">MIG</h2>
<h2 id="mps">MPS</h2>

<h1 id="pros-and-cons-of-gpu-partitioning-methods">Pros and Cons of GPU Partitioning Methods</h1>
<h1 id="requirements-gpu-nodes-with-gpus">Requirements: GPU Nodes with GPUs</h1>
<h1 id="validate-and-gpu-partioning">Validate and GPU Partioning</h1>
<h1 id="testing-with-llms">Testing with LLMs</h1>
<h1 id="nvidia-gpu-operator">Nvidia GPU Operator</h1>

<h1 id="links-of-interest">Links of Interest</h1>
<ul>
  <li><a href="https://rahulschand.github.io/gpu_poor/">VRAM Calculator</a></li>
  <li><a href="https://blog.vllm.ai/2023/06/20/vllm.html"></a></li>
  <li><a href="https://towardsdatascience.com/choosing-the-right-gpu-for-deep-learning-on-aws-d69c157d8c86"></a></li>
</ul>]]></content><author><name>Muthu Kamalan</name></author><category term="blog" /><category term="personal" /><summary type="html"><![CDATA[1. Overview Large LLMs like Llama-3-70b or Falcon 180B may not fit in a single GPU.]]></summary></entry><entry><title type="html">Kubernetes</title><link href="https://github.com/blog/kubernetes/" rel="alternate" type="text/html" title="Kubernetes" /><published>2026-07-27T00:00:00+00:00</published><updated>2026-07-27T00:00:00+00:00</updated><id>https://github.com/blog/kubernetes</id><content type="html" xml:base="https://github.com/blog/kubernetes/"><![CDATA[<h1 id="kubernetes">Kubernetes</h1>

<p><img src="/../assets/2026-07-27-kubernetes/default-thumbnail.png" alt="k8s" /></p>

<h2 id="basics">Basics</h2>
<p>If you like cars, before diving into engine specs and horsepower, you first need to know how to drive. In this blog is no different—so before we get under the hood with intermediate concepts, let’s briefly touch on the basics to make sure we’re all on the same page. Promise we’ll keep it quick!</p>
<h3 id="setup">Setup</h3>
<ul>
  <li><a href="https://github.com/kubernetes/minikube/releases/latest">Minikube</a></li>
  <li><a href="https://docs.docker.com/desktop/use-desktop/kubernetes/">Docker Desktop</a></li>
</ul>

<h3 id="verify">Verify</h3>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>kubectl config view  <span class="c"># tells which cluster it talks to</span>
kubectl config view <span class="nt">--raw</span> <span class="c"># </span>
kubectl config get-contexts <span class="si">$(</span>kubectl config current-context<span class="si">)</span>  <span class="c"># details</span>
kubectl config use-context <span class="c"># </span>

kubectl api-resources <span class="nt">--api-group</span><span class="o">=</span>apps <span class="nt">--namespaced</span><span class="o">=</span><span class="nb">false</span>
</code></pre></div></div>

<div class="language-yml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">apiVersion</span><span class="pi">:</span> <span class="s">v1</span>
<span class="na">clusters</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">cluster</span><span class="pi">:</span>
    <span class="na">certificate-authority-data</span><span class="pi">:</span> <span class="s">LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJkekNDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdGMyVnkKZG1WeUxXTmhRREUzT0RRNE16Y3dNalV3SGhjTk1qWXdOekl6TWpBd016UTFXaGNOTXpZd056SXdNakF3TXpRMQpXakFqTVNFd0h3WURWUVFEREJock0zTXRjMlZ5ZG1WeUxXTmhRREUzT0RRNE16Y3dNalV3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFRZGxhNnpjaFljbklkVHN3M2U2NmNocG1kL2dEdWdJMkx5UEY3L1BTOXcKWDNsUVRyWnNmaCtsNDZ0eHdiekxyQmVyR3pLL3lDak5tS05PWXFQMlhHK1FvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVUo3LzlwZmE1NStkS1ZxZXZTdjRaCm9GaURyZmt3Q2dZSUtvWkl6ajBFQXdJRFNBQXdSUUloQUpjWkRzUzJuUzdOcG9XWHNPUkN0RGdUSER6YS9FdkEKVm1vTG5HSlA0MjhkQWlBcVlNajUyNXhiUFlNVE90WmlsVnZrd1U4bUI4OUtJVkF2VSthZUhBSERlUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K</span>
    <span class="na">server</span><span class="pi">:</span> <span class="s">https://127.0.0.1:6443</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">default</span>
<span class="na">contexts</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">context</span><span class="pi">:</span>
    <span class="na">cluster</span><span class="pi">:</span> <span class="s">default</span>
    <span class="na">user</span><span class="pi">:</span> <span class="s">default</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">default</span>
<span class="na">current-context</span><span class="pi">:</span> <span class="s">default</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">Config</span>
<span class="na">users</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">default</span>
  <span class="na">user</span><span class="pi">:</span>
    <span class="na">client-certificate-data</span><span class="pi">:</span> <span class="s">LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJrVENDQVRlZ0F3SUJBZ0lJSGs0NGVNd2lGU013Q2dZSUtvWkl6ajBFQXdJd0l6RWhNQjhHQTFVRUF3d1kKYXpOekxXTnNhV1Z1ZEMxallVQXhOemcwT0RNM01ESTFNQjRYRFRJMk1EY3lNekl3TURNME5Wb1hEVEkzTURjeQpNekl3TURNME5Wb3dNREVYTUJVR0ExVUVDaE1PYzNsemRHVnRPbTFoYzNSbGNuTXhGVEFUQmdOVkJBTVRESE41CmMzUmxiVHBoWkcxcGJqQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJFRHZzNVFOL0cwTHRVVGIKc3p4WW43aXYyeTZSY1drakdmc3lVSjdzaVYrYlVBcXpLNXNKa3RIWWNpcUJDMGRndU5UekwxeDYvNjNsTWVUWQpwYk5pclB1alNEQkdNQTRHQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBakFmCkJnTlZIU01FR0RBV2dCU2NhOTk3MWVkMmhBUHJNOUlTMnRsbmtkc1dxVEFLQmdncWhrak9QUVFEQWdOSUFEQkYKQWlCZXBXT2hHSmtvdWk1RVdvbzMxZWFpSDF1MGROYzlrQkdIZmI1ejQ3czlId0loQUtLUTZsM3JWVFhLK1hTdQpuWkUzbUJ6U2Vvd1R1bENQdDBUd0lvY1lmODJnCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJlRENDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdFkyeHAKWlc1MExXTmhRREUzT0RRNE16Y3dNalV3SGhjTk1qWXdOekl6TWpBd016UTFXaGNOTXpZd056SXdNakF3TXpRMQpXakFqTVNFd0h3WURWUVFEREJock0zTXRZMnhwWlc1MExXTmhRREUzT0RRNE16Y3dNalV3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFUQnlFd2pKVDF6bVN0OVBuR1MranZGNkN0NklTVkdnTTg0bkNVWGxRZUIKNHVGT3FlZUxheDA4eENRTGozZXpBKzJCNloxaWp2dXpGSkl3QXpoeEJVTm5vMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVW5HdmZlOVhuZG9RRDZ6UFNFdHJaClo1SGJGcWt3Q2dZSUtvWkl6ajBFQXdJRFNRQXdSZ0loQUxvbnhMeWVpWVYzbXd4M2JoY25mVFZnd0RQbkhxOXkKY2pHaU9PVEpTQ3JpQWlFQTduZ0NGNC9CZ3JJQzhTaDJGaEgvd0V2ZHFSTXZ5czdRd3RWQjFCWWdOUFU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K</span>
    <span class="na">client-key-data</span><span class="pi">:</span> <span class="s">LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSUlJcWJXd2FiemFwWGxYRVBwMGswa21RditqWjNpYkxVOGNvd09jaTBHUVJvQW9HQ0NxR1NNNDkKQXdFSG9VUURRZ0FFUU8remxBMzhiUXUxUk51elBGaWZ1Sy9iTHBGeGFTTVorekpRbnV5Slg1dFFDck1ybXdtUwowZGh5S29FTFIyQzQxUE12WEhyL3JlVXg1TmlsczJLcyt3PT0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQo=</span>
</code></pre></div></div>
<div class="language-md highlighter-rouge"><div class="highlight"><pre class="highlight"><code>NAME                                SHORTNAMES   APIVERSION                          NAMESPACED   KIND
bindings                                         v1                                  true         Binding
componentstatuses                   cs           v1                                  false        ComponentStatus
configmaps                          cm           v1                                  true         ConfigMap
endpoints                           ep           v1                                  true         Endpoints
events                              ev           v1                                  true         Event
limitranges                         limits       v1                                  true         LimitRange
namespaces                          ns           v1                                  false        Namespace
nodes                               no           v1                                  false        Node
persistentvolumeclaims              pvc          v1                                  true         PersistentVolumeClaim
persistentvolumes                   pv           v1                                  false        PersistentVolume
pods                                po           v1                                  true         Pod
podtemplates                                     v1                                  true         PodTemplate
replicationcontrollers              rc           v1                                  true         ReplicationController
resourcequotas                      quota        v1                                  true         ResourceQuota
secrets                                          v1                                  true         Secret
serviceaccounts                     sa           v1                                  true         ServiceAccount
services                            svc          v1                                  true         Service
mutatingwebhookconfigurations                    admissionregistration.k8s.io/v1     false        MutatingWebhookConfiguration
validatingadmissionpolicies                      admissionregistration.k8s.io/v1     false        ValidatingAdmissionPolicy
validatingadmissionpolicybindings                admissionregistration.k8s.io/v1     false        ValidatingAdmissionPolicyBinding
validatingwebhookconfigurations                  admissionregistration.k8s.io/v1     false        ValidatingWebhookConfiguration
customresourcedefinitions           crd,crds     apiextensions.k8s.io/v1             false        CustomResourceDefinition
apiservices                                      apiregistration.k8s.io/v1           false        APIService
controllerrevisions                              apps/v1                             true         ControllerRevision
daemonsets                          ds           apps/v1                             true         DaemonSet
deployments                         deploy       apps/v1                             true         Deployment
replicasets                         rs           apps/v1                             true         ReplicaSet
statefulsets                        sts          apps/v1                             true         StatefulSet
selfsubjectreviews                               authentication.k8s.io/v1            false        SelfSubjectReview
tokenreviews                                     authentication.k8s.io/v1            false        TokenReview
localsubjectaccessreviews                        authorization.k8s.io/v1             true         LocalSubjectAccessReview
selfsubjectaccessreviews                         authorization.k8s.io/v1             false        SelfSubjectAccessReview
selfsubjectrulesreviews                          authorization.k8s.io/v1             false        SelfSubjectRulesReview
subjectaccessreviews                             authorization.k8s.io/v1             false        SubjectAccessReview
horizontalpodautoscalers            hpa          autoscaling/v2                      true         HorizontalPodAutoscaler
cronjobs                            cj           batch/v1                            true         CronJob
jobs                                             batch/v1                            true         Job
certificatesigningrequests          csr          certificates.k8s.io/v1              false        CertificateSigningRequest
leases                                           coordination.k8s.io/v1              true         Lease
endpointslices                                   discovery.k8s.io/v1                 true         EndpointSlice
events                              ev           events.k8s.io/v1                    true         Event
flowschemas                                      flowcontrol.apiserver.k8s.io/v1     false        FlowSchema
prioritylevelconfigurations                      flowcontrol.apiserver.k8s.io/v1     false        PriorityLevelConfiguration
gatewayclasses                      gc           gateway.networking.k8s.io/v1        false        GatewayClass
gateways                            gtw          gateway.networking.k8s.io/v1        true         Gateway
grpcroutes                                       gateway.networking.k8s.io/v1        true         GRPCRoute
httproutes                                       gateway.networking.k8s.io/v1        true         HTTPRoute
referencegrants                     refgrant     gateway.networking.k8s.io/v1beta1   true         ReferenceGrant
helmchartconfigs                                 helm.cattle.io/v1                   true         HelmChartConfig
helmcharts                                       helm.cattle.io/v1                   true         HelmChart
accesscontrolpolicies                            hub.traefik.io/v1alpha1             false        AccessControlPolicy
aiservices                                       hub.traefik.io/v1alpha1             true         AIService
apiaccesses                                      hub.traefik.io/v1alpha1             true         APIAccess
apibundles                                       hub.traefik.io/v1alpha1             true         APIBundle
apicatalogitems                                  hub.traefik.io/v1alpha1             true         APICatalogItem
apiplans                                         hub.traefik.io/v1alpha1             true         APIPlan
apiportals                                       hub.traefik.io/v1alpha1             true         APIPortal
apiratelimits                                    hub.traefik.io/v1alpha1             true         APIRateLimit
apis                                             hub.traefik.io/v1alpha1             true         API
apiversions                                      hub.traefik.io/v1alpha1             true         APIVersion
managedsubscriptions                             hub.traefik.io/v1alpha1             true         ManagedSubscription
addons                                           k3s.cattle.io/v1                    true         Addon
etcdsnapshotfiles                                k3s.cattle.io/v1                    false        ETCDSnapshotFile
nodes                                            metrics.k8s.io/v1beta1              false        NodeMetrics
pods                                             metrics.k8s.io/v1beta1              true         PodMetrics
ingressclasses                                   networking.k8s.io/v1                false        IngressClass
ingresses                           ing          networking.k8s.io/v1                true         Ingress
ipaddresses                         ip           networking.k8s.io/v1                false        IPAddress
networkpolicies                     netpol       networking.k8s.io/v1                true         NetworkPolicy
servicecidrs                                     networking.k8s.io/v1                false        ServiceCIDR
runtimeclasses                                   node.k8s.io/v1                      false        RuntimeClass
poddisruptionbudgets                pdb          policy/v1                           true         PodDisruptionBudget
clusterrolebindings                              rbac.authorization.k8s.io/v1        false        ClusterRoleBinding
clusterroles                                     rbac.authorization.k8s.io/v1        false        ClusterRole
rolebindings                                     rbac.authorization.k8s.io/v1        true         RoleBinding
roles                                            rbac.authorization.k8s.io/v1        true         Role
deviceclasses                                    resource.k8s.io/v1                  false        DeviceClass
resourceclaims                                   resource.k8s.io/v1                  true         ResourceClaim
resourceclaimtemplates                           resource.k8s.io/v1                  true         ResourceClaimTemplate
resourceslices                                   resource.k8s.io/v1                  false        ResourceSlice
priorityclasses                     pc           scheduling.k8s.io/v1                false        PriorityClass
csidrivers                                       storage.k8s.io/v1                   false        CSIDriver
csinodes                                         storage.k8s.io/v1                   false        CSINode
csistoragecapacities                             storage.k8s.io/v1                   true         CSIStorageCapacity
storageclasses                      sc           storage.k8s.io/v1                   false        StorageClass
volumeattachments                                storage.k8s.io/v1                   false        VolumeAttachment
volumeattributesclasses             vac          storage.k8s.io/v1                   false        VolumeAttributesClass
ingressroutes                                    traefik.io/v1alpha1                 true         IngressRoute
ingressroutetcps                                 traefik.io/v1alpha1                 true         IngressRouteTCP
ingressrouteudps                                 traefik.io/v1alpha1                 true         IngressRouteUDP
middlewares                                      traefik.io/v1alpha1                 true         Middleware
middlewaretcps                                   traefik.io/v1alpha1                 true         MiddlewareTCP
serverstransports                                traefik.io/v1alpha1                 true         ServersTransport
serverstransporttcps                             traefik.io/v1alpha1                 true         ServersTransportTCP
tlsoptions                                       traefik.io/v1alpha1                 true         TLSOption
tlsstores                                        traefik.io/v1alpha1                 true         TLSStore
traefikservices                                  traefik.io/v1alpha1                 true         TraefikService

</code></pre></div></div>
<h3 id="excerise">Excerise</h3>
<ul>
  <li><strong>Pod</strong>
The smallest and simplest Kubernetes object. It represents a single instance of a running process in your cluster.
    <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>kubectl run web-pod <span class="nt">--image</span><span class="o">=</span>gcr.io/google-samples/kubernetes-bootcamp:v1 <span class="nt">--dry-run</span><span class="o">=</span>client <span class="nt">-o</span> yml <span class="o">&gt;</span> pod.yml
</code></pre></div>    </div>
  </li>
  <li><strong>Replica Set</strong></li>
  <li><strong>Deployment</strong></li>
  <li><strong>Rollout</strong></li>
  <li><strong>Service</strong>
    <ul>
      <li><strong>ClusterIP</strong></li>
      <li><strong>NodePort</strong></li>
      <li><strong>LoadBalancer</strong></li>
    </ul>
  </li>
  <li><strong>ConfigMap</strong></li>
  <li><strong>Secrets</strong></li>
  <li><strong>Namespace</strong></li>
  <li>
    <hr />
  </li>
</ul>]]></content><author><name>Muthu Kamalan</name></author><category term="blog" /><category term="work" /><summary type="html"><![CDATA[Kubernetes]]></summary></entry><entry><title type="html">Know Kserve</title><link href="https://github.com/blog/know-kserve/" rel="alternate" type="text/html" title="Know Kserve" /><published>2026-05-04T00:00:00+00:00</published><updated>2026-05-04T00:00:00+00:00</updated><id>https://github.com/blog/know-kserve</id><content type="html" xml:base="https://github.com/blog/know-kserve/"><![CDATA[<p><img src="/../assets/2026-07-27-know-kserve/default-thumbnail.png" alt="kserve" /></p>]]></content><author><name>Muthu Kamalan</name></author><category term="blog" /><category term="work" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">My Love ❤️</title><link href="https://github.com/blog/my-love/" rel="alternate" type="text/html" title="My Love ❤️" /><published>2025-01-17T00:00:00+00:00</published><updated>2025-01-17T00:00:00+00:00</updated><id>https://github.com/blog/my-love</id><content type="html" xml:base="https://github.com/blog/my-love/"><![CDATA[<p><img src="/../assets/2026-07-27-my-love/default-thumbnail.png" alt="love" /></p>

<p>எண்ணம் உண்டோ என்னை👉👈 அறிய <br />
கண்ணில் மை பூசி காதல்🫶🏼 செய்ய</p>

<p>தாய்மை அறியவே இனி தனிமை தவிர்ப்பேன்</p>

<p>இனி நீ தஞ்சம் புகும் புதுமணையில்🏡 வர்ணம்🌈 தீட்டு <br />
வானை🦚 அறிந்து வளையல் பூட்டு, <br />
காதல்❤️ பேசு காவியம் பாடு▷ , <br />
புதுமை படி அதை எளிமை செய் <br />
ஆனந்தம்🎼 பாடு அதில் அர்த்தம் அறி</p>

<p>என்ன என்று எடுத்துறை <br />
காது பிடித்து கடிந்துறை 😤<br />
ஊருக்கு உறைக்கும் முன் என்னிடம் உண்மை சொல்<br />
நான் ஓய்ந்து இருந்தால் ஒழுக்கம் செய்<br />
அயர்ந்து இருந்தால் அள்ளிக்கொள் 🤗<br /></p>

<p>வரதட்சணையாக வாரம் 12 முத்தங்களும், <br />
வழக்காட சில குறும்புகளும் - வந்திரனும்<br />
சீர்வரிசை யாக சில சில சண்டைகள் போதும்</p>

<p>அறிவேனோ ஆயிரம் நான் அறை பொழுதிலே <br />
ஆனால் அமரன்‌‌👑 போல வாழ்வேன் என்றும் என் மேல் அன்பு🫰 கொள்வியானாள்</p>]]></content><author><name>Muthu Kamalan</name></author><category term="blog" /><category term="personal" /><category term="book summary" /><category term="writing" /><category term="love" /><summary type="html"><![CDATA[Finding you won't just complete me]]></summary></entry><entry><title type="html">Git in Practical</title><link href="https://github.com/blog/git-in-practical/" rel="alternate" type="text/html" title="Git in Practical" /><published>2023-06-22T00:00:00+00:00</published><updated>2023-06-22T00:00:00+00:00</updated><id>https://github.com/blog/git-in-practical</id><content type="html" xml:base="https://github.com/blog/git-in-practical/"><![CDATA[<p><img src="/../assets/2026-07-27-git-in-practical/default-thumbnail.png" alt="GIT" /></p>

<h2 id="introduction">Introduction</h2>
<p>Distributed version control systems combine the capabilities of local and remote systems. Developers can store the entire codebase locally, allowing independent work and offline changes. Developers then synchronize their local changes to a central server for other collaborators to consume.</p>

<p>where as, GitHub is a cloud-based service that hosts Git repositories (Centralized Platform)</p>

<hr />
<h3 id="installation">Installation</h3>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># GIT</span>
<span class="nb">sudo </span>apt update <span class="o">&amp;&amp;</span> <span class="nb">sudo </span>apt <span class="nb">install </span>git
git <span class="nt">--version</span>
<span class="c"># GIT LFS</span>
<span class="nb">sudo </span>apt-get <span class="nb">install </span>git-lfs
git lfs <span class="nb">install</span>
</code></pre></div></div>
<hr />
<h3 id="configuration">Configuration</h3>

<p>config file loaded fron <code class="language-plaintext highlighter-rouge">~/.gitconfig</code> or <code class="language-plaintext highlighter-rouge">~/.config/git/</code> dir</p>
<div class="language-toml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">[user]</span>
        <span class="py">name</span> <span class="p">=</span> <span class="err">USER_NAME</span>
        <span class="py">email</span> <span class="p">=</span> <span class="err">USER_MAIL</span>
<span class="nn">[core]</span>
        <span class="py">editor</span> <span class="p">=</span> <span class="err">code</span> <span class="err">--wait</span>
<span class="nn">[init]</span>
        <span class="py">defaultbranch</span> <span class="p">=</span> <span class="err">main</span>
<span class="nn">[log]</span>
        <span class="py">decorate</span> <span class="p">=</span> <span class="err">full</span>
<span class="nn">[rerere]</span>
        <span class="py">enabled</span> <span class="p">=</span> <span class="kc">false</span>
<span class="nn">[advice]</span>
        <span class="py">forcedeletebranch</span> <span class="p">=</span> <span class="kc">true</span>
<span class="nn">[alias]</span>
    <span class="py">lol</span><span class="p">=</span> <span class="s">"!git --no-pager log --oneline --decorate --graph --parents"</span>
    <span class="py">wdiff</span> <span class="p">=</span> <span class="err">diff</span> <span class="err">-w</span> <span class="py">--word-diff</span><span class="p">=</span><span class="err">color</span> <span class="err">--ignore-space-at-eol</span>
    <span class="py">ss</span> <span class="p">=</span> <span class="err">status</span> <span class="err">-bsv</span>
<span class="nn">[commit]</span>
    <span class="py">verbose</span><span class="p">=</span><span class="kc">true</span>
</code></pre></div></div>

<hr />
<h3 id="globallocal-namespace">Global/Local Namespace</h3>
<p><code class="language-plaintext highlighter-rouge">--global adding config in global space</code> <br />
<code class="language-plaintext highlighter-rouge">--local adding config in local git-space level</code></p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git config <span class="nt">--global</span> user.name <span class="s2">"Your name"</span>
git config <span class="nt">--global</span> user.email <span class="s2">"email@domain.com"</span>
git config <span class="nt">--global</span> core.editor <span class="s2">"code --wait"</span>
git config <span class="nt">--global</span> init.defaultbranch main
git config <span class="nt">--global</span> log.decorate full
git config <span class="nt">--global</span> rerere.enabled <span class="nb">false
</span>git config <span class="nt">--global</span> advice.forcedeletebranch <span class="nb">true</span>

<span class="c"># set </span>
git config <span class="nt">--add</span> <span class="nt">--local</span> webflyx.tone Black
git config <span class="nt">--add</span> <span class="nt">--local</span> webflyx.status Married
git config <span class="nt">--add</span> <span class="nt">--local</span> webflyx.status FamilyMan
<span class="c"># unset</span>
git config <span class="nt">--unset</span> <span class="nt">--local</span> webflyx.tone
<span class="c"># unset-all</span>
git config <span class="nt">--unset-all</span> <span class="nt">--local</span> webflyx.status
<span class="c"># remove section</span>
git config <span class="nt">--remove-section</span> webflyx
</code></pre></div></div>

<hr />
<h4 id="git-tracks-content">Git Tracks content</h4>

<p><img src="https://git-scm.com/book/en/v2/images/lifecycle.png" alt="stage of git" /></p>

<p>Git is a <code class="language-plaintext highlighter-rouge">content tracking system</code>.  The Git Object store is based on the <code class="language-plaintext highlighter-rouge">hashed</code> computation of the <code class="language-plaintext highlighter-rouge">content</code> of its object not on the file or dir names
Example,</p>
<ul>
  <li>If two seperate file located in 2 different dir have exactly the same content, Git stores a sole copy of that content as blob within the object store</li>
  <li>It stores every version of every file - not the differences.</li>
</ul>

<table>
  <thead>
    <tr>
      <th>System</th>
      <th>Index  Mechanism</th>
      <th>Data Store</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Data Base</td>
      <td>Indexed Sequential Access Method</td>
      <td>Data Records</td>
    </tr>
    <tr>
      <td>Git</td>
      <td><code class="language-plaintext highlighter-rouge">.git/objects/hash</code>, <code class="language-plaintext highlighter-rouge">tree object contents</code></td>
      <td>Blob Objects, tree objects</td>
    </tr>
  </tbody>
</table>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>.git/
├── branches
├── config
├── description
├── HEAD
├── hooks
│__ ├── applypatch-msg.sample
│__ ├── commit-msg.sample
│__ ├── fsmonitor-watchman.sample
│__ ├── post-update.sample
│__ ├── pre-applypatch.sample
│__ ├── pre-commit.sample
│__ ├── pre-merge-commit.sample
│__ ├── prepare-commit-msg.sample
│__ ├── pre-push.sample
│__ ├── pre-rebase.sample
│__ ├── pre-receive.sample
│__ ├── push-to-checkout.sample
│__ ├── sendemail-validate.sample
│__ └── update.sample
├── info
│__ └── exclude
├── objects
│__ ├── info
│__ └── pack
└── refs
    ├── heads
    └── tags
</code></pre></div></div>

<hr />
<h3 id="initalize">initalize</h3>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git init
<span class="nb">touch </span>README.md <span class="o">&amp;&amp;</span> git add <span class="nb">.</span>
git commit <span class="nt">-m</span> <span class="s1">'Initial commit'</span>

git clone &lt;url&gt;
git clone <span class="nt">-b</span> <span class="nt">--single-branch</span> rbranch &lt;url&gt;   <span class="c"># git branch -a &amp;&amp; git checkout &lt;remote-branch&gt;</span>
git clone &lt;url&gt; &lt;<span class="nb">dir</span><span class="o">&gt;</span>   <span class="c"># Clone particular folder in the Repo</span>
git clone <span class="nt">--depth</span><span class="o">=</span>1 &lt;url&gt; <span class="c"># bring only one commit</span>
git clone <span class="nt">--mirror</span> &lt;repository-url&gt;  <span class="c"># mirror</span>


<span class="c"># Adding to repo</span>
git remote add origin &lt;url&gt;
git remote <span class="nt">-v</span> <span class="c"># details about push/pull</span>
git remote set-url origin  &lt;new-url&gt;   <span class="c"># origin sets upto new url</span>
git push <span class="nt">-u</span> &lt;origin/REMOTE-NAME&gt; &lt;local-branch-name&gt;:&lt;remote/origin&gt;      <span class="c"># -u make it upstream</span>
git push <span class="nt">-d</span> &lt;branch&gt; <span class="c"># delete the branch</span>
</code></pre></div></div>

<hr />
<h3 id="log">Log</h3>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git <span class="nt">--no-pager</span> log <span class="nt">--oneline</span> <span class="nt">--decorate</span> <span class="nt">--graph</span> <span class="nt">--parents</span> <span class="nt">--all</span>
git show &lt;commit-hash&gt;  <span class="c"># Examine commit</span>
git show HEAD
</code></pre></div></div>

<hr />
<h3 id="branching">branching</h3>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git switch &lt;existing-branch&gt;
git switch <span class="nt">-c</span> &lt;new-branch&gt;
git branch
git branch <span class="nt">-a</span>
git branch <span class="nt">-r</span>
git branch <span class="nt">-d</span> &lt;branch-name&gt;  <span class="c"># keep git history</span>
git branch <span class="nt">-D</span> &lt;branch-name&gt;  <span class="c"># remove git history</span>
</code></pre></div></div>

<hr />
<h3 id="update-only-the-latest-commit">update only the latest commit</h3>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git commit <span class="nt">--amend</span> <span class="nt">-m</span> <span class="s1">'Updated commit message'</span> <span class="c"># update only the message</span>

<span class="c"># Forget file in the commit</span>
git add &lt;file<span class="o">(</span>s<span class="o">)&gt;</span>
git commit <span class="nt">--amend</span> <span class="nt">--no-edit</span>

<span class="c"># Undo the Last commit</span>
git reset <span class="nt">--soft</span> HEAD~1  <span class="c"># --soft option is useful if u want to go back to prev commit, but keep all of your changes. Committed changes will be uncommited and staged, while uncommitted changes will remain staged or unstaged as before.</span>

git reset <span class="nt">--hard</span> HEAD~1 <span class="c"># delete it from the staging area as well.</span>
</code></pre></div></div>

<hr />
<h3 id="tag">Tag</h3>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git tag <span class="c"># list all tags</span>
git show tag-no.
git tag <span class="nt">-a</span> tag-no <span class="c"># with annotated-message</span>
git push <span class="nt">--tags</span>  <span class="c"># push only tags</span>
git push origin tag-no <span class="c"># push only that tag</span>
git tag tag-no commit-hash
git tag <span class="nt">-d</span> tag-noo

git tag <span class="nt">-a</span> v1.0.0 <span class="nt">-m</span> <span class="s1">'Release 1.0.0'</span> <span class="c"># RECOMMENDED WAY</span>


git push origin v1.0.0 <span class="c"># push specific tag</span>
git push origin <span class="nt">--tags</span> <span class="c"># push all tags </span>
git push origin <span class="nt">--delete</span> v1.0.0 <span class="c"># delete remote tag</span>
</code></pre></div></div>

<hr />
<h3 id="merge">Merge</h3>
<p>conflict markers</p>

<div class="language-md highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD
<span class="gu">  Changes introduced by the main branch
======
</span>  Changes introduced by the widgets branch
<span class="gt">&gt;&gt;&gt;&gt;&gt;&gt;&gt; branch</span>
</code></pre></div></div>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git merge <span class="nt">--abort</span>
git switch &lt;main&gt; <span class="o">&amp;&amp;</span> git merge branch <span class="c"># --ff --no-ff --ff-only</span>
git merge <span class="nt">--squash</span>/--no-squash    <span class="c"># in the branch do squash and merge</span>
</code></pre></div></div>

<hr />
<h3 id="fetch">Fetch</h3>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># git push uploads commits from a local repository to a remote repository, while git fetch downloads commits.</span>

<span class="c"># git pull = git fetch + merge</span>

git fetch origin main <span class="nt">-v</span>
git switch main
git merge origin/main   <span class="c"># git rebase origin/main</span>
</code></pre></div></div>

<hr />
<h3 id="stash">stash</h3>

<p>When you are in the middle of something, your boss comes in and demands that you fix something immediately. 
Traditionally, you would make a commit to a temporary branch to store your changes away, and 
return to your original branch to make the emergency fix, like this:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>- ... hack hack hack ...
- $ git switch -c my_wip
- $ git commit -a -m "WIP"
- $ git switch master
- $ edit emergency fix
- $ git commit -a -m "Fix in a hurry"
- $ git switch my_wip
- $ git reset --soft HEAD^
- ... continue hacking ...
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>- ... hack hack hack ...
- $ git stash
- $ edit emergency fix
- $ git commit -a -m "Fix in a hurry"
- $ git stash pop
- ... continue hacking ...
</code></pre></div></div>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git stash <span class="nt">-u</span>   <span class="c"># stash untracked file as well   -m ""</span>
git stash show
git stash pop
git stash apply stash@<span class="o">{</span>2<span class="o">}</span>   <span class="c"># git stash pop --index 2</span>
git stash drop stash@<span class="o">{</span>2<span class="o">}</span>
git stash clear <span class="c"># clear all</span>
</code></pre></div></div>

<hr />
<h3 id="revert">Revert</h3>
<p>creates a <strong>new commit</strong> that undoes a previous one — safe for shared/remote branches 
since it doesn’t rewrite history</p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git revert &lt;commit-hash&gt;          <span class="c"># undo a specific commit (opens editor)</span>
git revert &lt;commit-hash&gt; <span class="nt">--no-edit</span>  <span class="c"># skip the editor, use default message</span>
git revert HEAD                   <span class="c"># undo the last commit</span>
git revert HEAD~3..HEAD           <span class="c"># revert a range (newest to oldest)</span>
git revert <span class="nt">-n</span> &lt;commit-hash&gt;       <span class="c"># stage the revert without committing (--no-commit)</span>
git revert <span class="nt">--continue</span>             <span class="c"># after resolving revert conflicts</span>
git revert <span class="nt">--abort</span>                <span class="c"># abandon the revert mid-way</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">Note: If you pushed changed been revert, no merge conflict will happen</code>
<img src="git-revert-vs-reset.svg" alt="revert vs reset" /></p>

<hr />
<h3 id="reset">Reset</h3>

<p>Reset current HEAD to the specified state
<code class="language-plaintext highlighter-rouge">Note: Never use git reset on commits already pushed</code></p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git reset <span class="nt">--hard</span> COMMISH   <span class="c"># clears the mess from the index file and the working tree.</span>
git reset <span class="nt">--soft</span> COMMISH   <span class="c"># leaves all your changed files</span>
</code></pre></div></div>

<hr />
<h3 id="restore">Restore</h3>
<p>git restore is a focused command for discarding working tree changes or unstaging files</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Discard working directory changes (unstaged)</span>
git restore &lt;file&gt;                        <span class="c"># restore file to last commit state;;  Git will retrieve the state of these file(s) from the HEAD commit, and revert them back to that version</span>

git restore <span class="nb">.</span>                             <span class="c"># restore all modified files</span>

<span class="c"># Unstage a file (move from index back to working tree)</span>
git restore <span class="nt">--staged</span> &lt;file&gt;               <span class="c">#  you accidentally add file to stage then wanna remove;; equivalent to: git reset HEAD &lt;file&gt;</span>

git restore <span class="nt">--staged</span> <span class="nb">.</span>                    <span class="c"># unstage everything</span>

<span class="c"># Restore from a specific source</span>
git restore <span class="nt">--source</span> &lt;commit-hash&gt; &lt;file&gt; <span class="c"># restore file from any commit</span>
git restore <span class="nt">--source</span> HEAD~2 config.yaml   <span class="c"># example: go back 2 commits for a file</span>
git restore <span class="nt">--source</span> origin/main &lt;file&gt;   <span class="c"># restore to remote state</span>
</code></pre></div></div>

<hr />
<h3 id="rebase">Rebase</h3>
<p>Rebase replays commits on top of another base — producing a linear history. Preferred over merge in feature-branch workflows.</p>

<pre><code class="language-log">
                                       H---I---J topicB
                                      /
                             E---F---G  topicA
                            /
               A---B---C---D  master

git rebase --onto master topicA topicB

                            H'--I'--J'  topicB
                           /
                           | E---F---G  topicA
                           |/
               A---B---C---D  master
</code></pre>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git rebase <span class="nt">--onto</span> &lt;source-branch&gt; &lt;topic-branch&gt;   <span class="c"># play topic commit one-by-one onto source</span>
<span class="c"># remove conflicts</span>

git rebase <span class="nt">--continue</span>
git rebase <span class="nt">--abort</span>


<span class="c">### Interactive</span>
git rebase <span class="nt">-i</span> HEAD~3  <span class="c"># range of HEAD</span>
</code></pre></div></div>
<h3 id="reorder">Reorder</h3>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git rebase <span class="nt">-i</span> HEAD~2
<span class="c"># reorder as you need &amp; Be careful when performing this step. Accidentally deleting a `commit line` will cause Git to destroy the commit.</span>

<span class="c"># line order only changes below</span>

pick 7f9d4bf Updated README            -&gt;  pick 3f8e810 Accessibility fix
pick 3f8e810 Accessibility fix         -&gt;  pick 7f9d4bf Updated README
</code></pre></div></div>

<h3 id="pick">Pick</h3>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># p, pick &lt;commit&gt; = use commit</span>
<span class="c"># nothing changes</span>
<span class="sb">`</span>pick<span class="sb">`</span> 7f9d4bf E:Accessibility fix       -&gt; <span class="sb">`</span>pick<span class="sb">`</span> 7f9d4bf    E:Accessibility fix 
<span class="sb">`</span>pick<span class="sb">`</span> 3f8e810 F:Updated screenreader    -&gt; <span class="sb">`</span>pick<span class="sb">`</span> 3f8e810  F:Updated screenreader
</code></pre></div></div>

<h3 id="squash">Squash</h3>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># s, squash &lt;commit&gt; = use commit, but meld into previous commit</span>

pick 7f9d4bf E:Accessibility fix       -&gt; pick 7f9d4bf    E:Accessibility fix 
<span class="sb">`</span>pick<span class="sb">`</span> 3f8e810 F:Updated screenreader  -&gt; <span class="sb">`</span>squash<span class="sb">`</span> 3f8e810  F:Updated screenreader
<span class="sb">`</span>pick<span class="sb">`</span> ec48d74 G:Added comments        -&gt; <span class="sb">`</span>squash<span class="sb">`</span> ec48d74  G:Added comments 
</code></pre></div></div>
<pre><code class="language-log">A &lt;- B &lt;- C &lt;- D &lt;- E &lt;- F &lt;- G

git rebase -i HEAD~3

A &lt;- B &lt;- C &lt;- D
               ^-- E={E+F+G}
</code></pre>

<h3 id="split">Split</h3>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># splitting</span>
<span class="c"># use commit, but stop for amending</span>

pick 7f9d4bf E:Accessibility fix         -&gt; pick 7f9d4bf    E:Accessibility fix 
<span class="sb">`</span>pick<span class="sb">`</span> 3f8e810 F:Updated screenreader    -&gt; <span class="sb">`</span>edit<span class="sb">`</span> 3f8e810  F:Updated screenreader 
<span class="sb">`</span>pick<span class="sb">`</span> ec48d74 G:Added comments          -&gt; <span class="sb">`</span>pick<span class="sb">`</span> ec48d74  G:Added comments 


Stopped at 3f8e810...  F:Updated screenreader 

<span class="c"># OUR Untracked File</span>
<span class="c"># untrack1.cs untrack5.cs untrack4.cs untrack3.cs untrack2.cs</span>

git add untrack1.cs untrack2.cs untrack3.cs untrack4.cs <span class="o">&amp;&amp;</span> git commit <span class="nt">-m</span> <span class="s2">"Added untrack-files"</span>
git add untrack5.cs <span class="o">&amp;&amp;</span> git commit <span class="nt">-m</span> <span class="s2">"Fixed bug untrack-files"</span>
git rebase <span class="nt">--continue</span>


<span class="nv">$ </span>git log <span class="nt">--oneline</span> <span class="nt">--no-pager</span>
A &lt;- B &lt;- C &lt;- D &lt;- E &lt;- F &lt;- <span class="s2">"Added untrack-files"</span> &lt;- <span class="s2">"Fixed bug untrack-files"</span> &lt;- <span class="s2">"G"</span>

</code></pre></div></div>

<h3 id="reword">Reword</h3>
<p><code class="language-plaintext highlighter-rouge">Note: # most recent commit's message use --amend</code></p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git rebase <span class="nt">-i</span> HEAD~2
pick 7f9d4bf Frontpag bug fiz   -&gt; reword 7f9d4bf Frontpag bug fix
pick 3f8e810 Refactored navbar  -&gt; pick 3f8e810 Refactored navbar
<span class="c"># Commit message</span>
</code></pre></div></div>

<h3 id="delete">Delete</h3>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># d, drop &lt;commit&gt; = remove commit</span>

git rebase <span class="nt">-i</span> HEAD~3
<span class="c"># delete it</span>
pick 2f8e823 Refactored                         -&gt; pick 2f8e823 Refactored
pick 7f9d4bf Updated README                     -&gt; drop 7f9d4bf Updated README
pick 3f8e810 Accessibility fix                  -&gt; drop 3f8e810 Accessibility fix
</code></pre></div></div>

<hr />
<h3 id="cherry-pick">Cherry pick</h3>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git cherry-pick <span class="nt">-e</span> &lt;commit-hash&gt; <span class="c"># Cherry-pick and edit commit message</span>
git cherry-pick &lt;commit-hash&gt; <span class="c"># Cherry-pick single commit</span>
<span class="c"># Cherry-pick multiple commits</span>
git cherry-pick &lt;commit1&gt; &lt;commit2&gt; 
git cherry-pick &lt;commit1&gt;..&lt;commit2&gt; 
</code></pre></div></div>

<hr />
<h3 id="reflog">Reflog</h3>
<p>it records every movement of HEAD, even across resets, rebases, and deleted branches. Entries expire after 90 days by default.</p>

<hr />
<h3 id="bisect">Bisect</h3>
<p>Helps to find the exact commit that introduced a bug</p>

<hr />
<h3 id="submodules">Submodules</h3>
<p>Include another repository inside your project using git submodule or git subtree.</p>

<hr />
<h3 id="advance-commands">Advance commands</h3>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git gc <span class="c"># Garbage collection</span>
git fsck <span class="c"># Verify repository integrity</span>
git repack <span class="nt">-ad</span>  <span class="c"># Optimize repository</span>
git prune  <span class="c"># Prune unreachable objects</span>
git count-objects <span class="nt">-vH</span> <span class="c"># Show repository size</span>
git blame file.txt  <span class="c"># Show who changed each line of file</span>
git clean <span class="nt">-n</span> <span class="c"># Show what would be removed</span>
git clean <span class="nt">-f</span> <span class="c"># Remove untracked files</span>
git clean <span class="nt">-fd</span> <span class="c"># Remove untracked files and directories</span>
git clean <span class="nt">-fdx</span> <span class="c"># Remove ignored files as well</span>
git clean <span class="nt">-i</span> <span class="c"># Interactive clean</span>
</code></pre></div></div>

<hr />

<h5 id="notes">NOTES::</h5>

<ol>
  <li>
    <p>git reset –hard deleted uncommitted work
```md
<code class="language-plaintext highlighter-rouge">git reset --hard</code> discards both staged and unstaged changes permanently — no undo. :(</p>
  </li>
  <li><code class="language-plaintext highlighter-rouge">git fsck --lost-found --full --no-reflogs --unreachable</code></li>
  <li>cd <code class="language-plaintext highlighter-rouge">.git/lost-found/</code></li>
</ol>

<p>Checking object directories: 100% (256/256), done.</p>
<ul>
  <li>unreachable blob <code class="language-plaintext highlighter-rouge">4413d81d94e76ea9a7f7741786f63426d71d297a</code></li>
  <li>unreachable blob <code class="language-plaintext highlighter-rouge">e613e50292dd773b7e829f598d58e6d419301ec1</code></li>
  <li>unreachable tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904</li>
</ul>

<p>git show –stat <code class="language-plaintext highlighter-rouge">4413d81d94e76ea9a7f7741786f63426d71d297a</code> &gt; recovery-file-a.txt
git show –stat <code class="language-plaintext highlighter-rouge">e613e50292dd773b7e829f598d58e6d419301ec1</code> &gt; recovery-file-a.txt</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
2. 
```md
Running `git checkout &lt;commit-hash&gt;` moves HEAD directly to a commit instead of a branch, 
so any new commits won't belong to any branch.

before-leaving  `git checkout -b new-branch-name`, to keep work done in detached HEAD
</code></pre></div></div>

<ol>
  <li>Pushed .env file to sensitive data
```md
revoke and rotate exposed credentials
<code class="language-plaintext highlighter-rouge">git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch .env' HEAD</code></li>
</ol>

<p>clean the history<code class="language-plaintext highlighter-rouge">git push origin --force --all</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
4. Push rejected — non-fast-forward
```md
Never do `git push --force` overrites others work. Use `--force-with-lease` at minimum.

1. pull `git pull origin main`
2. resolve `merge conflict`
3. push `git push origin main`

1. rebase it `git pull --rebase origin main`

To globally configure use, `git config --global pull.rebase true`
</code></pre></div></div>

<ol>
  <li>Wrong commit message
```md</li>
  <li><code class="language-plaintext highlighter-rouge">git commit --amend -m 'Correct message here'</code></li>
  <li>
    <p>if already pushed then do <code class="language-plaintext highlighter-rouge">git push --force-with-lease</code>
```</p>
  </li>
  <li>Accidentally delete branch
    <div class="language-md highlighter-rouge"><div class="highlight"><pre class="highlight"><code>look in <span class="sb">`git reflog`</span> for the last commit msg on the deleted branch and recreate using <span class="sb">`git checkout -b recovered-branch &lt;sha&gt;`</span>
</code></pre></div>    </div>
  </li>
  <li>Forget to add file in the last commit message
```md
<code class="language-plaintext highlighter-rouge">git add forgetten-file</code> and do <code class="language-plaintext highlighter-rouge">git commit --amend --no-edit</code>.</li>
</ol>

<p>If it’s pushed then <code class="language-plaintext highlighter-rouge">git push --force-with-lease</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
8. Need to undo a commit that's already been pushed and shared
```md
No reset, do revert.
</code></pre></div></div>

<ol>
  <li>Identify the large Object
    <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git rev-list <span class="nt">--objects</span> <span class="nt">--all</span> | <span class="nb">sort</span> <span class="nt">-k2</span> | <span class="nb">tail</span> <span class="nt">-20</span>
</code></pre></div>    </div>
  </li>
  <li>Wrong files are being tracked
    <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git <span class="nb">rm</span> <span class="nt">-r</span> <span class="nt">--cached</span> node_modules/
</code></pre></div>    </div>
  </li>
  <li>Empty commit
    <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git commit <span class="nt">--allow-empty</span> <span class="nt">-m</span> <span class="s2">"chore: retrigger CI build"</span>
</code></pre></div>    </div>
  </li>
  <li>Skip CI
    <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git commit <span class="nt">--no-verify</span> <span class="c">#Git hook bypass </span>
</code></pre></div>    </div>
  </li>
</ol>]]></content><author><name>Muthu Kamalan</name></author><category term="blog" /><category term="work" /><category term="software" /><category term="learning" /><category term="tools" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Bash Scripting</title><link href="https://github.com/blog/bash-scripting/" rel="alternate" type="text/html" title="Bash Scripting" /><published>2023-05-01T00:00:00+00:00</published><updated>2023-05-01T00:00:00+00:00</updated><id>https://github.com/blog/bash-scripting</id><content type="html" xml:base="https://github.com/blog/bash-scripting/"><![CDATA[<p><img src="/../assets/2026-07-27-bash-scripting/default-thumbnail.png" alt="bash" /></p>

<h1 id="bash---the-repl-shell">Bash - the REPL Shell</h1>

<p>Bash is REPL: [<strong>R</strong>ead <strong>E</strong>val <strong>P</strong>rint <strong>L</strong>oop] <br />
You type text, Bash reads it, evaluates it as code, prints the result, then waits for more. This tiny loop quietly runs half the modern internet.</p>

<hr />

<h2 id="terminal-basics">Terminal Basics</h2>
<blockquote>

  <p>The terminal is your cmd to the operating system. These commands let you look around, move through directories, and create, inspect, or modify files without a GUI. Mastering these primitives turns the shell from a typing exercise into a precise navigation and file-manipulation tool</p>
</blockquote>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">ls</span> <span class="nt">-lah</span>                         <span class="c"># list all files and dir in current folder</span>
<span class="nb">pwd</span>                             <span class="c"># write pathfile of current folder</span>
<span class="nb">touch </span>filename.extension        <span class="c"># create file</span>
<span class="nb">rm</span> <span class="nt">-i</span> file                      <span class="c"># interactively remove from system. os.Remove(file)</span>
<span class="nb">mkdir</span> <span class="nt">-pv</span> <span class="nb">dirname</span>               <span class="c"># make folder</span>
<span class="nb">rmdir</span> <span class="nt">-pv</span> dirnam                <span class="c"># remove folder</span>
<span class="nb">cd </span>destination_place            <span class="c"># change current directory =&gt; destination_place</span>
<span class="nb">cat</span> <span class="nt">-n</span> filename                 <span class="c"># print it in console</span>
<span class="nb">head</span> <span class="nt">-n</span> num_of_lines filename
<span class="nb">tail</span> <span class="nt">-n</span> num_of_lines filename
<span class="nb">echo </span>hello world <span class="o">&gt;</span> file.txt     <span class="c"># redirect/overwrite in the file</span>
<span class="nb">echo</span> <span class="s2">"bye"</span> <span class="o">&gt;&gt;</span> file.txt          <span class="c"># append file</span>
</code></pre></div></div>

<hr />

<h2 id="searching-text-with-grep">Searching Text with <code class="language-plaintext highlighter-rouge">grep</code></h2>
<blockquote>

  <p><code class="language-plaintext highlighter-rouge">grep</code> searches text using patterns, not just plain words. It scans line by line and prints only the lines that match. This makes it one of the most powerful tools for exploring logs, configs, and source code—especially when combined with regular expressions</p>
</blockquote>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">grep</span> <span class="nt">-A1</span> pattern file               <span class="c"># 1 line after</span>
<span class="nb">grep</span> <span class="nt">-B1</span> pattern file               <span class="c"># 1 line before</span>
<span class="nb">grep</span> <span class="nt">-C2</span> pattern file               <span class="c"># Context ( 2 Line )</span>
<span class="nb">grep</span> <span class="nt">-i</span> pattern file                <span class="c"># ignore case-sensitive</span>
<span class="nb">grep</span> <span class="nt">-o</span> <span class="s1">'^.'</span> file                   <span class="c"># starts with single line</span>
<span class="nb">grep</span> <span class="s1">'^starts_with'</span> file
<span class="nb">grep</span> <span class="s1">'ends_with$'</span> file
<span class="nb">grep</span> <span class="s1">'regex-pattern'</span> filename
<span class="nb">grep</span> <span class="nt">-o</span> <span class="s1">'^dog'</span> filename              <span class="c"># first starts with ^cat of each line</span>
<span class="nb">cat </span>README.md | <span class="nb">grep</span> <span class="nt">-i</span> <span class="s2">"pattern"</span>
</code></pre></div></div>

<hr />

<h2 id="paging-the-file">paging the file</h2>
<blockquote>

  <p>Paging tools let you view large files one screen at a time instead of dumping everything into the terminal at once. They’re essential when reading logs, manuals, or command output that doesn’t fit on a single screen.</p>
</blockquote>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>less filename   <span class="c"># less is more :)</span>
more filename
</code></pre></div></div>

<hr />

<h2 id="command-introspection">Command Introspection</h2>
<blockquote>

  <p>Command introspection helps you answer a deceptively important question: what exactly is Bash running when you type a command?
A name might resolve to a builtin, an alias, a keyword, or an external binary—and knowing which one you’re invoking prevents subtle surprises.</p>
</blockquote>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">compgen</span> <span class="nt">-b</span> <span class="o">&gt;</span> builtins_cmd.txt  <span class="c"># list all building commands</span>
<span class="nb">compgen</span> <span class="nt">-a</span>                     <span class="c"># alias</span>
<span class="nb">compgen</span> <span class="nt">-k</span>                     <span class="c"># bash keywords</span>

which cmd
<span class="nb">type</span> <span class="nt">-a</span> cmd  <span class="c"># shows builtin/alias/hashed/bin-address</span>
file <span class="k">*</span>
</code></pre></div></div>

<hr />

<h2 id="environment--identity">Environment &amp; Identity</h2>
<blockquote>

  <p>The shell runs inside a context</p>
</blockquote>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># environment path</span>
<span class="nb">echo</span> <span class="nv">$PATH</span> | <span class="nb">tr</span> : <span class="s1">'\n'</span>  <span class="c"># translate old new</span>
<span class="nb">echo</span> <span class="nv">$PWD</span>
<span class="nb">echo</span> <span class="nv">$MACHTYPE</span>
<span class="nb">echo</span> <span class="nt">-n</span> <span class="nv">$HOSTNAME</span>       <span class="c"># no new-line at end</span>
<span class="nb">whoami
uname</span> <span class="nt">-a</span>
</code></pre></div></div>

<hr />

<h2 id="variable--command-subsitutions">Variable &amp; Command Subsitutions</h2>
<blockquote>

  <p>Variables store text values, and command substitution lets you capture the output of a command as a value.</p>
</blockquote>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># init variable</span>
<span class="nv">AWS_S3</span><span class="o">=</span><span class="s2">"sk-12345"</span>  <span class="c"># Always DOUBLE QUOTE the variable</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$AWS_S3</span><span class="s2">"</span>

<span class="nv">AWS_USER</span><span class="o">=</span><span class="sb">`</span><span class="nb">uname</span> <span class="nt">-a</span><span class="sb">`</span>        <span class="c"># Old School way of command substitution</span>
<span class="nv">AWS_USER</span><span class="o">=</span><span class="si">$(</span><span class="nb">uname</span> <span class="nt">-m</span><span class="si">)</span>       <span class="c"># Best Pratice of command substitution/ preferred</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$AWS_USER</span><span class="s2">, and password </span><span class="nv">$AWS_S3</span><span class="s2">"</span>
</code></pre></div></div>

<hr />

<h2 id="file-permission">File Permission</h2>
<blockquote>

  <p>Every file in Unix has an access contract: who can read it, who can modify it, and who can execute it. File permissions enforce that contract, and the shell gives you direct control over it.</p>
</blockquote>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># File Permission</span>
<span class="c"># permission ? owned-by group file-size modified-date dir/file</span>
file filename
<span class="nb">chmod</span> +x file  <span class="c"># change permission of the file to executable mode.</span>
<span class="nb">chmod </span>755 file
</code></pre></div></div>

<hr />

<h2 id="shebang--exit-code">Shebang &amp; Exit Code</h2>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/usr/bin/bash</span>
<span class="nb">echo</span> <span class="nv">$?</span>                <span class="c"># check any error in the last cmd run</span>
</code></pre></div></div>

<pre><code class="language-Makefile">SHELL        = /usr/bin/bash
.SHELLFLAGS := -eu -o pipefail -c
PYTHON      ?= $(shell command -v python3 || command -v python)
PIP          = $(PYTHON) -m pip
</code></pre>

<hr />

<h2 id="input">Input</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">read </span>first_name last_name
<span class="o">&gt;</span> Linux love bash

<span class="nb">read</span> <span class="nt">-r</span> variable_address
<span class="o">&gt;</span> voc nagar

<span class="nb">read</span> <span class="nt">-rp</span> <span class="s2">"Enter your linux OS: "</span> name
<span class="o">&gt;</span> Arch

<span class="nb">read</span> <span class="nt">-rsp</span> <span class="s2">"Password: "</span> os_password
<span class="o">&gt;</span> <span class="k">*****</span>

<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$first_name</span><span class="s2">, </span><span class="nv">$last_name</span><span class="s2">"</span>  <span class="c"># Linux, love bash</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$variable_address</span><span class="s2">"</span>        <span class="c"># voc nagar</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$name</span><span class="s2">"</span>                    <span class="c"># Arch</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$os_password</span><span class="s2">"</span>             <span class="c"># *****</span>
</code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Postional Params as Input</span>
<span class="c"># $0   # Script name</span>
<span class="c"># $1   # first args</span>
<span class="c"># $2   # seconda arg</span>
<span class="c"># $@   # all args (safe)</span>
<span class="c"># $*   # all args (unsafe)</span>
<span class="c"># $#   # args count</span>
</code></pre></div></div>

<hr />

<h2 id="conditional">Conditional</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/usr/bin/bash</span>
<span class="k">if</span> <span class="o">[[</span> <span class="nt">-n</span> <span class="nv">$1</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>        <span class="c">#help '[['      #$1   &lt;Second argment while calling script&gt;</span>
    <span class="nb">echo</span> <span class="s2">"Hi, </span><span class="nv">$1</span><span class="s2">"</span>
<span class="k">else</span>
    <span class="c"># read only one line</span>
    <span class="nb">read</span> <span class="nt">-rp</span> <span class="s2">"Enter your name: "</span> stdin        <span class="c"># -r means raw-string; -p prompt</span>
    <span class="nb">echo</span> <span class="s2">"hello, </span><span class="nv">$stdin</span><span class="s2">"</span>
<span class="k">fi

</span><span class="nb">help</span> <span class="s1">'['</span>   <span class="c"># test</span>
<span class="nb">help</span> <span class="s1">'[['</span>
<span class="nb">help let</span>
<span class="c"># [[ -a ]]                      True if file exists</span>
<span class="c"># [[ -d FILE ]]                 True if file is a directory.</span>
<span class="c"># [[ -e FILE ]]                 True if file exists.</span>
<span class="c"># [[ -f FILE ]]                 True if file exists and is a regular file.</span>
<span class="c"># [[ FILE1 -nt FILE2 ]]         True if file1 is newer than file2 (according to modification date).</span>
<span class="c"># [[ FILE1 -ot FILE2 ]]         True if file1 is older than file2</span>
<span class="c"># [[ -z STRING ]]               True if string is empty.</span>
<span class="c"># [[ -n STRING ]]               True if string is not empty.</span>
<span class="c"># [[  STRING1 = STRING2 ]]      True if the strings are equal.</span>
<span class="c"># [[ STRING1 != STRING2 ]]      True if the strings are not equal.</span>
<span class="c"># [[ STRING1 &lt; STRING2 ]]       True if STRING1 sorts before STRING2 lexicographically.</span>
<span class="c"># [[ STRING1 &gt; STRING2 ]]       True if STRING1 sorts after STRING2 lexicographically.</span>
<span class="c"># [[ ! EXPR ]]                  True if expr is false.</span>
<span class="c"># [[ EXPR1 -a EXPR2 ]]          True if both expr1 AND expr2 are true.</span>
<span class="c"># [[ EXPR1 -o EXPR2 ]]          True if either expr1 OR expr2 is true.</span>
</code></pre></div></div>

<hr />

<h2 id="tests--comparisons">Tests &amp; Comparisons</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/bash</span>
<span class="nv">a</span><span class="o">=</span>2
<span class="nv">b</span><span class="o">=</span>2
<span class="k">if</span> <span class="o">[[</span> <span class="nv">$a</span> <span class="o">==</span> <span class="nv">$b</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then
    </span><span class="nb">echo</span> <span class="s1">'a and b are same'</span>
<span class="k">fi

</span><span class="nv">c</span><span class="o">=</span>3
<span class="nv">d</span><span class="o">=</span>4
<span class="k">if</span> <span class="o">[[</span> <span class="nv">$c</span> <span class="o">!=</span> <span class="nv">$d</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then
    </span><span class="nb">echo</span> <span class="s1">'c and d are not same'</span>
<span class="k">fi

if</span> <span class="o">!</span> <span class="o">[[</span> <span class="nv">$c</span> <span class="o">==</span><span class="nv">$d</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then
    </span><span class="nb">echo</span> <span class="s1">'C and D are not same'</span>
<span class="k">fi

if</span> <span class="o">[[</span> <span class="nt">-f</span> file.txt <span class="o">]]</span><span class="p">;</span> <span class="k">then
    </span><span class="nb">echo</span> <span class="s2">"file.txt exists and is a file"</span>
<span class="k">else
    </span><span class="nb">echo</span> <span class="s2">"file.txt not exists"</span>
<span class="k">fi</span>
</code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">true</span>   <span class="c"># $? =&gt; 0</span>
<span class="nb">false</span>  <span class="c"># $? =&gt; 1</span>
</code></pre></div></div>

<hr />

<h2 id="case-statement">Case statement</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/usr/bin/bash</span>
<span class="nv">s</span><span class="o">=</span><span class="nv">$1</span>
<span class="k">case</span> <span class="s2">"</span><span class="nv">$s</span><span class="s2">"</span> <span class="k">in
    </span>girl<span class="p">)</span>
        <span class="nb">echo </span>Hello, Girl
        <span class="p">;;</span>
    boy<span class="p">)</span>
        <span class="nb">echo  </span>Hello, boy
        <span class="p">;;</span>
    kamal<span class="k">*</span> <span class="p">|</span> rev<span class="k">*</span><span class="p">)</span>
        <span class="nb">echo </span>there, you are
        <span class="p">;;</span>
    lo<span class="k">*</span><span class="p">)</span>
        <span class="nb">echo </span>anything starts with love
        <span class="p">;</span>&amp;                                  <span class="c"># fall-through</span>
    love<span class="o">)</span>
        <span class="nb">echo </span>love is all
        <span class="p">;;</span>
    <span class="k">*</span><span class="p">)</span>
        <span class="nb">echo</span> <span class="s2">"Hello </span><span class="nv">$1</span><span class="s2">"</span>
        <span class="p">;;</span>
<span class="k">esac</span>
</code></pre></div></div>

<hr />

<h2 id="control-flow--loops">Control Flow &amp; Loops</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/usr/bin/bash</span>
<span class="k">for </span>i <span class="k">in</span> <span class="s2">"0"</span>, <span class="s2">"muthu"</span>, kamalan<span class="p">;</span> <span class="k">do</span>   <span class="c"># For loop</span>
    <span class="nb">echo</span> <span class="s2">"i: </span><span class="nv">$i</span><span class="s2">"</span>
<span class="k">done

for </span>i <span class="k">in</span> <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span>,<span class="s2">"</span><span class="nv">$2</span><span class="s2">"</span>,<span class="s2">"</span><span class="nv">$3</span><span class="s2">"</span>,<span class="s2">"</span><span class="nv">$@</span><span class="s2">"</span><span class="p">;</span> <span class="k">do</span>   <span class="c"># For loop</span>
    <span class="nb">echo</span> <span class="s2">"i: </span><span class="nv">$i</span><span class="s2">"</span>
<span class="k">done

while</span> <span class="o">[[</span> <span class="nt">-f</span> file.txt <span class="o">]]</span><span class="p">;</span> <span class="k">do
    </span><span class="nb">echo</span> <span class="s2">"file.txt exists"</span>
    <span class="nb">sleep </span>1
<span class="k">done

for </span>i <span class="k">in</span> <span class="o">{</span>a..f<span class="o">}</span><span class="p">;</span><span class="k">do</span>           <span class="c"># [a,b,c,d,e,f]</span>
    <span class="nb">echo</span> <span class="s2">"count, </span><span class="nv">$i</span><span class="s2">"</span>
<span class="k">done

for </span>i <span class="k">in</span> <span class="o">{</span>1..5<span class="o">}</span><span class="p">;</span><span class="k">do</span>           <span class="c"># [1,2,3,4,5]</span>
    <span class="nb">echo</span> <span class="s2">"count, </span><span class="nv">$i</span><span class="s2">"</span>
<span class="k">done

</span><span class="nv">max</span><span class="o">=</span>5
<span class="k">for</span> <span class="o">((</span><span class="nv">i</span><span class="o">=</span>0<span class="p">;</span>i&lt;max<span class="p">;</span> i++<span class="o">))</span><span class="p">;</span> <span class="k">do
    </span><span class="nb">echo</span> <span class="s2">"count, </span><span class="nv">$i</span><span class="s2">"</span>
<span class="k">done</span>
</code></pre></div></div>

<hr />

<h2 id="function--scope">Function &amp; Scope</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/usr/bin/bash</span>

greet<span class="o">(){</span>
    <span class="nb">local </span><span class="nv">name</span><span class="o">=</span><span class="nv">$1</span>              <span class="c"># by-default, global variable</span>
    <span class="nb">echo</span> <span class="s2">"hello, </span><span class="nv">$name</span><span class="s2"> from function"</span>
<span class="o">}</span>

<span class="k">for </span>name <span class="k">in</span> <span class="s2">"</span><span class="nv">$@</span><span class="s2">"</span><span class="p">;</span> <span class="k">do
    </span>greet <span class="s2">"</span><span class="nv">$name</span><span class="s2">"</span>
<span class="k">done</span>
</code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/usr/bin/bash</span>
hello<span class="o">(){</span>
    <span class="nb">local </span><span class="nv">s</span><span class="o">=</span><span class="nv">$1</span>
    <span class="nb">echo</span> <span class="s2">"hello, </span><span class="nv">$s</span><span class="s2">!"</span>
    <span class="k">return </span>0
<span class="o">}</span>
goodbye<span class="o">(){</span>
    <span class="nb">local </span><span class="nv">s</span><span class="o">=</span><span class="nv">$1</span>
    <span class="nb">echo</span> <span class="s2">"goodbye, </span><span class="nv">$s</span><span class="s2">!"</span> <span class="o">&gt;</span> &amp;1
<span class="o">}</span>


<span class="c"># IO Redirections:: stdin,stdout, stderr</span>
<span class="nb">cat </span>missingfile 2&gt; error.txt  <span class="c"># to redirect error msg</span>
<span class="nb">cat </span>missingfile 2&gt;  /dev/null <span class="c">#  throw to black whole</span>
<span class="c"># help '(('</span>
<span class="c"># $# tells number of args</span>
<span class="c"># &amp;0  stdin</span>
<span class="c"># &amp;1  stdout</span>
<span class="c"># &amp;2  stderr</span>
<span class="k">if</span> <span class="o">((</span><span class="nv">$#=</span><span class="o">=</span>0<span class="o">))</span><span class="p">;</span> <span class="k">then
    </span><span class="nb">echo</span> <span class="s1">'name required! &gt;&amp;2'</span>
    <span class="nb">exit </span>1
<span class="k">fi
for </span>name <span class="k">in</span> <span class="s2">"</span><span class="nv">$@</span><span class="s2">"</span><span class="p">;</span> <span class="k">do
    if</span>  <span class="o">[[</span> <span class="nv">$name</span> <span class="o">==</span> m<span class="k">*</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then
        </span>hello <span class="s2">"</span><span class="nv">$name</span><span class="s2">"</span>
    <span class="k">elif</span> <span class="o">[[</span> <span class="nv">$name</span> <span class="o">==</span> k<span class="k">*</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then
        </span>hello <span class="s2">"</span><span class="nv">$name</span><span class="s2">"</span>
    <span class="k">else
        </span>goodbye <span class="s2">"</span><span class="nv">$name</span><span class="s2">"</span>
    <span class="k">fi
done</span>
</code></pre></div></div>

<hr />

<h2 id="reading-files-safely">Reading Files Safely</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/usr/bin/bash</span>
<span class="nb">read</span> <span class="nt">-rp</span> <span class="s2">"Enter your name: "</span> word
<span class="nb">echo</span> <span class="s2">"single word: </span><span class="nv">$word</span><span class="s2">"</span>


<span class="c"># sometime use `echo -n ???` new line won't populate so we use `[[ -n $line ]]`</span>
<span class="k">while </span><span class="nb">read</span> <span class="nt">-r</span> line <span class="o">||</span> <span class="o">[[</span> <span class="nt">-n</span> <span class="nv">$line</span> <span class="o">]]</span><span class="p">;</span> <span class="k">do</span>         <span class="c"># read from file line by line</span>
    :
<span class="k">done

</span><span class="nb">help</span> : <span class="c"># Null command</span>
</code></pre></div></div>

<hr />

<h2 id="indexed-array">Indexed Array</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/bash</span>
<span class="nb">declare</span> <span class="nt">-a</span> <span class="nv">array</span><span class="o">=(</span>
    muthu
    revathi
    <span class="s2">"voc nagar"</span>
    kovilpatti
<span class="o">)</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="k">${</span><span class="nv">array</span><span class="p">[0]</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="k">${</span><span class="nv">array</span><span class="p">[1]</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="k">${</span><span class="nv">array</span><span class="p">[2]</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="k">${</span><span class="nv">array</span><span class="p">[-1]</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="k">${</span><span class="nv">array</span><span class="p">[-2]</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="k">${</span><span class="nv">array</span><span class="p">[2000000]</span><span class="k">}</span><span class="s2">"</span>  <span class="c"># returns "\n"</span>

<span class="nv">idx</span><span class="o">=</span>2
<span class="nb">echo</span> <span class="s2">"idx: </span><span class="k">${</span><span class="nv">array</span><span class="p">[idx]</span><span class="k">}</span><span class="s2">"</span>      <span class="c"># valid</span>
<span class="nb">echo</span> <span class="s2">"idx: </span><span class="k">${</span><span class="nv">array</span><span class="p">[</span><span class="nv">$idx</span><span class="p">]</span><span class="k">}</span><span class="s2">"</span>

<span class="nb">echo</span> <span class="s2">"using *: </span><span class="k">${</span><span class="nv">array</span><span class="p">[*]</span><span class="k">}</span><span class="s2">"</span>    <span class="c"># stringfy</span>
<span class="nb">echo</span> <span class="s2">"using @ : </span><span class="k">${</span><span class="nv">array</span><span class="p">[@]</span><span class="k">}</span><span class="s2">"</span>


<span class="k">for </span>item <span class="k">in</span> <span class="s2">"</span><span class="k">${</span><span class="nv">array</span><span class="p">[*]</span><span class="k">}</span><span class="s2">"</span><span class="p">;</span> <span class="k">do
    </span><span class="nb">echo</span> <span class="s2">"item in * is: </span><span class="nv">$item</span><span class="s2">"</span>
<span class="k">done


for </span>item <span class="k">in</span> <span class="s2">"</span><span class="k">${</span><span class="nv">array</span><span class="p">[@]</span><span class="k">}</span><span class="s2">"</span><span class="p">;</span> <span class="k">do
    </span><span class="nb">echo</span> <span class="s2">"item in @ is: </span><span class="nv">$item</span><span class="s2">"</span>
<span class="k">done

</span><span class="nv">members</span><span class="o">=</span><span class="s2">"</span><span class="k">${</span><span class="nv">array</span><span class="p">[@]</span><span class="k">}</span><span class="s2">"</span>  <span class="c"># stringfy and copy it  # WRONG WAY to do it</span>
<span class="nv">family</span><span class="o">=(</span> <span class="s2">"</span><span class="k">${</span><span class="nv">array</span><span class="p">[@]</span><span class="k">}</span><span class="s2">"</span> mariappan lakshmi <span class="o">)</span>
family+<span class="o">=(</span>rajapaul priya<span class="o">)</span>
<span class="k">for </span>m <span class="k">in</span> <span class="s2">"</span><span class="k">${</span><span class="nv">family</span><span class="p">[@]</span><span class="k">}</span><span class="s2">"</span><span class="p">;</span> <span class="k">do
    </span><span class="nb">echo</span> <span class="s2">"item is: </span><span class="nv">$m</span><span class="s2">"</span>
<span class="k">done

</span><span class="nb">declare</span> <span class="nt">-p</span> family


<span class="nv">alliswell</span><span class="o">=([</span>0]<span class="o">=</span><span class="s2">"atom"</span> <span class="o">[</span>27]<span class="o">=</span><span class="s2">"muthu"</span> <span class="o">[</span>24]<span class="o">=</span><span class="s2">"revathi"</span><span class="o">)</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="k">${</span><span class="nv">alliswell</span><span class="p">[@]</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="k">${#</span><span class="nv">alliswell</span><span class="p">[@]</span><span class="k">}</span><span class="s2">"</span>  <span class="c"># length of an array</span>
</code></pre></div></div>

<hr />

<h2 id="associative-array-">Associative Array <HashMap></HashMap></h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/usr/bin/bash</span>
<span class="k">if</span> <span class="o">!</span> <span class="nb">declare</span> <span class="nt">-A</span> fam<span class="p">;</span> <span class="k">then
    </span><span class="nb">echo</span> <span class="s2">"not able to make it"</span> <span class="o">&gt;</span>&amp;2
    <span class="nb">exit </span>1
<span class="k">fi
</span><span class="nb">declare</span> <span class="nt">-A</span> fam
fam[husband]<span class="o">=</span><span class="s2">"kamalan"</span>
fam[wife]<span class="o">=</span><span class="s2">"revathi"</span>

<span class="nb">echo</span> <span class="s2">"</span><span class="k">${</span><span class="nv">fam</span><span class="p">[husband]</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="k">${</span><span class="nv">fam</span><span class="p">[wife]</span><span class="k">}</span><span class="s2">"</span>

<span class="nb">echo</span> <span class="s2">"values: </span><span class="k">${</span><span class="nv">fam</span><span class="p">[@]</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"keys: </span><span class="k">${</span><span class="p">!fam[@]</span><span class="k">}</span><span class="s2">"</span>

<span class="nb">echo</span> <span class="s2">"stringfy: </span><span class="k">${</span><span class="nv">fam</span><span class="p">[*]</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"length: </span><span class="k">${#</span><span class="nv">fam</span><span class="p">[@]</span><span class="k">}</span><span class="s2">"</span>

<span class="k">for </span>key <span class="k">in</span> <span class="s2">"</span><span class="k">${</span><span class="p">!fam[@]</span><span class="k">}</span><span class="s2">"</span><span class="p">;</span> <span class="k">do
    </span><span class="nv">val</span><span class="o">=</span><span class="k">${</span><span class="nv">fam</span><span class="p">[</span><span class="nv">$key</span><span class="p">]</span><span class="k">}</span>
    <span class="nb">echo</span> <span class="s2">"key, </span><span class="nv">$key</span><span class="s2"> got value </span><span class="nv">$val</span><span class="s2">"</span>
<span class="k">done</span>
</code></pre></div></div>

<hr />

<h2 id="ifs-variable">IFS variable</h2>
<blockquote>

  <p>Internal Field Separator, and it tells Bash how to split text into pieces.</p>
</blockquote>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/bash</span>
<span class="nb">declare</span> <span class="nt">-a</span> <span class="nv">fam</span><span class="o">=(</span>
    <span class="s2">"kamalan"</span>
    <span class="s2">"revathi"</span>
    <span class="s2">"voc nagar"</span>
<span class="o">)</span>
<span class="nb">echo</span> <span class="s2">"stringfy: </span><span class="k">${</span><span class="nv">fam</span><span class="p">[*]</span><span class="k">}</span><span class="s2">"</span>
<span class="nv">IFS</span><span class="o">=</span>,
<span class="nb">echo</span> <span class="s2">"stringfy with "</span>,<span class="s2">": </span><span class="k">${</span><span class="nv">fam</span><span class="p">[*]</span><span class="k">}</span><span class="s2">"</span>
<span class="o">(</span>
    <span class="c"># sub shell / local scope</span>
    <span class="nv">IFS</span><span class="o">=</span><span class="se">\"</span>
    <span class="nb">echo</span> <span class="s2">"stringfy with </span><span class="se">\"</span><span class="s2">: </span><span class="k">${</span><span class="nv">fam</span><span class="p">[*]</span><span class="k">}</span><span class="s2">"</span>
<span class="o">)</span>
<span class="o">(</span>
    <span class="c"># sub shell / locl scope</span>
    <span class="nv">IFS</span><span class="o">=!</span>
    <span class="nb">echo</span> <span class="s2">"stringfy with !: </span><span class="k">${</span><span class="nv">fam</span><span class="p">[*]</span><span class="k">}</span><span class="s2">"</span>
<span class="o">)</span>
<span class="nb">echo</span> <span class="s2">"stringfy: </span><span class="k">${</span><span class="nv">fam</span><span class="p">[*]</span><span class="k">}</span><span class="s2">"</span>
</code></pre></div></div>

<hr />

<h2 id="command-subsitituion-vs-same-shell">command subsitituion vs Same Shell</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/bash</span>
<span class="nv">i</span><span class="o">=</span>100
say_hi<span class="o">(){</span>
    <span class="nv">i</span><span class="o">=</span>6 <span class="c"># local scope</span>
    <span class="nb">echo</span> <span class="s2">"hi, max-score </span><span class="nv">$i</span><span class="s2">"</span>
<span class="o">}</span>
<span class="nv">hello</span><span class="o">=</span><span class="si">$(</span>say_hi<span class="si">)</span>                <span class="c"># runs in sub-shell</span>
<span class="nb">echo</span> <span class="s2">"Greeting and </span><span class="nv">$hello</span><span class="s2">, there"</span>
<span class="nb">echo</span> <span class="s2">"i is </span><span class="nv">$i</span><span class="s2">"</span>                 <span class="c"># global scope</span>
</code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/bash</span>
<span class="nv">i</span><span class="o">=</span>100
say_hi<span class="o">(){</span>
    <span class="nv">i</span><span class="o">=</span>6 <span class="c"># local scope</span>
    <span class="nb">echo</span> <span class="s2">"hi, max-score </span><span class="nv">$i</span><span class="s2">"</span>
<span class="o">}</span>
say_hi                         <span class="c"># runs in same-shell</span>
<span class="nb">echo</span> <span class="s2">"Greeting and </span><span class="nv">$hello</span><span class="s2">, there"</span>
<span class="nb">echo</span> <span class="s2">"i is </span><span class="nv">$i</span><span class="s2">"</span>                 <span class="c"># global scope</span>
</code></pre></div></div>

<hr />

<h2 id="arithmetic-expression">Arithmetic expression</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/usr/bin/bash</span>
<span class="nv">a</span><span class="o">=</span>100000
<span class="nv">b</span><span class="o">=</span>100
<span class="nb">echo</span> <span class="k">$((</span> <span class="nv">$a</span><span class="o">*</span><span class="nv">$a</span> <span class="k">))</span>  <span class="c"># EXPRESSION</span>
<span class="o">((</span> max <span class="o">=</span> a <span class="o">&gt;</span> b ? a : b <span class="o">))</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$max</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="k">$((</span> <span class="s2">"word"</span><span class="o">*</span><span class="m">2</span> <span class="k">))</span><span class="s2">"</span> <span class="c"># =&gt; 0</span>
<span class="nb">help let

</span><span class="nv">a</span><span class="o">=</span>010  <span class="c">#Octa</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$a</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="k">$((</span> <span class="m">10</span><span class="c">#$a ))</span>
</code></pre></div></div>

<hr />

<h2 id="process-subsitution">process subsitution</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/usr/bin/bash</span>
<span class="nv">i</span><span class="o">=</span>0
<span class="k">while </span><span class="nb">read</span> <span class="nt">-r</span> word<span class="p">;</span> <span class="k">do
    </span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$word</span><span class="s2">"</span>
    <span class="o">((</span>i++<span class="o">))</span>
<span class="k">done</span> &lt; &lt;<span class="o">(</span><span class="nb">grep </span>d /usr/file.txt<span class="o">)</span>
<span class="o">(</span>

<span class="c"># NOTE: `&lt;(grep d /usr/file.txt)` is a file</span>
<span class="c"># NOTE: `read` #read it in streaming mode</span>
<span class="c"># File descriptor: A file descriptor in Linux (or Unix-like systems) is a small non-negative integer that a process uses as a handle to access an open file or I/O resource.  :: &lt;()</span>
</code></pre></div></div>

<h3 id="file-descriptor-in-c-program">file descriptor in C program</h3>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="c1">   // read, close</span><span class="cp">
#include</span> <span class="cpf">&lt;fcntl.h&gt;</span><span class="c1">    // open</span><span class="cp">
#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="c1">    // perror</span><span class="cp">
</span><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="kt">char</span> <span class="n">buffer</span><span class="p">[</span><span class="mi">10</span><span class="p">];</span>
    <span class="kt">int</span> <span class="n">fd</span> <span class="o">=</span> <span class="n">open</span><span class="p">(</span><span class="s">"LICENsSE"</span><span class="p">,</span> <span class="n">O_RDONLY</span><span class="p">);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"File descriptor returned by open(): %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">fd</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">fd</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">perror</span><span class="p">(</span><span class="s">"open"</span><span class="p">);</span>
        <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="kt">int</span> <span class="n">bytes_read</span> <span class="o">=</span> <span class="n">read</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">buffer</span><span class="p">));</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">bytes_read</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">perror</span><span class="p">(</span><span class="s">"read"</span><span class="p">);</span>
        <span class="n">close</span><span class="p">(</span><span class="n">fd</span><span class="p">);</span>
        <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="n">write</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">bytes_read</span><span class="p">);</span>  <span class="c1">// write to stdout (fd 1)</span>
    <span class="n">close</span><span class="p">(</span><span class="n">fd</span><span class="p">);</span>
    <span class="n">write</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/usr/bin/bash</span>
<span class="c"># NOTE:</span>
<span class="nb">shift</span> <span class="c"># means move 2nd argument to 1st   $2-&gt;$1</span>
</code></pre></div></div>

<hr />

<h2 id="text-processing-cut-tr-awk-sed">Text Processing: cut, tr, awk, sed</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/usr/bin/bash</span>
<span class="nb">cat</span> <span class="o">&lt;&lt;</span><span class="no">EOF</span><span class="sh"> &gt; file.csv
name,age,city,capital
kamalan,27,kvp,chennai
revathi,24,cvp,"chennai, TN"
</span><span class="no">EOF

</span><span class="nb">cat </span>file.csv | <span class="nb">tr</span> , <span class="s2">"</span><span class="se">\t</span><span class="s2">"</span>       <span class="c"># translate , =&gt; \t</span>
<span class="nb">cat </span>file.csv | <span class="nb">cut</span> <span class="nt">-d</span> , <span class="nt">-f</span> 1-2,4-  <span class="c"># cut it by delimeter , and get field of column 1   &lt;index by 1&gt;</span>
</code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/usr/bin/bash</span>
man 5 passwd
<span class="c">#        •   login name</span>
<span class="c">#        •   optional encrypted password</span>
<span class="c">#        •   numerical user ID</span>
<span class="c">#        •   numerical group ID</span>
<span class="c">#        •   user name or comment field</span>
<span class="c">#        •   user home directory</span>
<span class="c">#        •   optional user command interpreter</span>
<span class="nb">cat</span> /etc/passwd | <span class="nb">cut</span> <span class="nt">-d</span> : <span class="nt">-f</span> 1,3,4 <span class="c"># print only login name</span>
<span class="c"># TODO</span>
<span class="nb">cat</span> /etc/passwd | <span class="nb">awk</span> <span class="nt">-F</span>: <span class="s1">'{ print $1, $7 }'</span>
<span class="nb">cat</span> /etc/passwd | <span class="nb">awk</span> <span class="nt">-F</span>: <span class="s1">'{ printf("name: %s\n",$1 ); }'</span>
<span class="nb">cat</span> /etc/passwd | <span class="nb">awk</span> <span class="nt">-F</span>: <span class="s1">' $1=="root" { printf("name: %s\n",$1 ); }'</span>

<span class="nb">cat</span> /etc/passwd | <span class="nb">awk</span> <span class="nt">-F</span>: <span class="s1">'{ printf("%s\n",$1 ); }'</span> | <span class="nb">sort</span> | <span class="nb">uniq</span> | <span class="nb">wc</span> <span class="nt">-l</span>

<span class="nb">wc</span> <span class="nt">-l</span> <span class="c"># lines</span>
<span class="nb">wc</span> <span class="nt">-w</span> <span class="c"># words</span>
<span class="nb">wc</span> <span class="nt">-c</span>
</code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/usr/bin/bash</span>
<span class="nb">declare</span> <span class="nt">-A</span> shells
<span class="k">while </span><span class="nv">IFS</span><span class="o">=</span>: <span class="nb">read</span> <span class="nt">-r</span> name pass uid gid gecos home shell<span class="p">;</span> <span class="k">do</span>
    <span class="c">#</span>
    <span class="k">if</span> <span class="o">[[</span> <span class="nv">$name</span> <span class="o">==</span> <span class="s1">'#'</span><span class="k">*</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then
        continue
    fi
    </span>shells[<span class="nv">$name</span><span class="o">]=</span><span class="nv">$shell</span>
    <span class="nb">echo</span> <span class="s2">"</span><span class="nv">$name</span><span class="s2"> has the shell: </span><span class="k">${</span><span class="nv">shells</span><span class="p">[</span><span class="nv">$name</span><span class="p">]</span><span class="k">}</span><span class="s2">"</span>
<span class="k">done</span> &lt; /etc/passwd

<span class="nb">declare</span> <span class="nt">-p</span> shells
</code></pre></div></div>

<hr />

<h2 id="finding--files">Finding  Files</h2>

<p><code class="language-plaintext highlighter-rouge">Note:</code> Use find with -exec for bulk operations</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>find location <span class="nt">-type</span> f <span class="c"># check only file</span>
find location <span class="nt">-type</span> f <span class="nt">-name</span> <span class="s1">'*.md'</span> <span class="c"># check only file</span>
find location <span class="nt">-type</span> d <span class="c"># check only file</span>
find location <span class="nt">-type</span> l <span class="c"># check only symlinks</span>

find location <span class="nt">-type</span> f <span class="nt">-name</span> <span class="s1">'*.md'</span>  <span class="nt">-exec</span> <span class="nb">echo </span>I found a file <span class="o">{}</span> <span class="se">\;</span>   <span class="c"># execute will run cmd on streaming/one-by-one</span>
find location <span class="nt">-type</span> f <span class="nt">-name</span> <span class="s1">'*.md'</span>  <span class="nt">-exec</span> <span class="nb">echo </span>I found a file <span class="o">{}</span> <span class="s1">';'</span>
find location <span class="nt">-type</span> f <span class="nt">-name</span> <span class="s1">'*.md'</span> | xargs                             <span class="c"># batch it</span>

find location <span class="nt">-type</span> f <span class="nt">-name</span> <span class="s1">'*.md'</span> <span class="nt">-print0</span> | xargs <span class="nt">-0</span>                 <span class="c"># separate null to new lines</span>
locate <span class="nt">--help</span>
</code></pre></div></div>

<hr />

<h2 id="debug-mode">Debug mode</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">PS4</span><span class="o">=</span><span class="s1">'[debug]: '</span> bash <span class="nt">-x</span> script.sh
bash <span class="nt">-n</span> script.sh                      <span class="c"># syntax check</span>
bash <span class="nt">-u</span> script.sh                      <span class="c"># check for undefined variable</span>
sellcheck script.sh
</code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/usr/bin/bash</span>
<span class="nb">set</span> <span class="nt">-x</span>
....                   <span class="c"># part of the section runs on debug mode</span>
....
<span class="nb">set</span> +x
</code></pre></div></div>

<hr />

<h2 id="pipestatus">Pipestatus</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!usr/bin/bash</span>
<span class="nb">cat </span>file_not_exists.txt | <span class="nb">tr</span> , <span class="s2">"</span><span class="se">\t</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="k">${</span><span class="nv">PIPESTATUS</span><span class="p">[*]</span><span class="k">}</span><span class="s2">"</span>

<span class="nb">true</span>| <span class="nb">false</span> | <span class="nb">true</span>| <span class="nb">false
echo</span> <span class="s2">"</span><span class="k">${</span><span class="nv">PIPESTATUS</span><span class="p">[*]</span><span class="k">}</span><span class="s2">"</span>
<span class="c"># Each command in a pipeline gets its own exit code.</span>
</code></pre></div></div>

<hr />

<h2 id="timing-command">Timing command</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">time</span> &lt;<span class="nt">---</span><span class="o">&gt;</span>
real  <span class="c"># wall clock</span>
user  <span class="c"># how much time it waits in user space</span>
sys   <span class="c"># how much time it waits in sys space</span>
</code></pre></div></div>

<hr />

<h2 id="sourcing-file">Sourcing File</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#  Create and populate into a file</span>
<span class="nb">cat</span> <span class="o">&lt;&lt;</span><span class="no">EOF</span><span class="sh"> &gt; /tmp/greeetings.sh
#!/bin/usr/bash
greet(){
    # run in local so don't mess with global scope
    local name=</span><span class="nv">$1</span><span class="sh">
    echo "hi, </span><span class="nv">$name</span><span class="sh">"
}

bye()(
    # runs in sub-shell
    name=</span><span class="nv">$1</span><span class="sh">
    echo "bye, </span><span class="nv">$name</span><span class="sh">"
)

if ! (return 2&gt;/dev/null); then
    # we are being called directly similar to if __name__=="__main__":
    greet test1
    bye test2
</span><span class="no">
EOF

</span><span class="nb">cat</span> <span class="o">&lt;&lt;</span><span class="no">EOF</span><span class="sh"> &gt; /tmp/test.sh
#!/usr/bin/bash
source /tmp/greeetings.sh || exit 1
greet muthukamalan
bye revathi
</span><span class="no">EOF

</span><span class="nb">chmod</span> +x /tmp/greeetings.sh
<span class="nb">chmod</span> +x /tmp/test.sh
bash /tmp/test.sh
</code></pre></div></div>

<hr />

<h2 id="params-expansion">params expansion</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">name</span><span class="o">=</span><span class="s2">"mutHu kamaLan"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$name</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"name: </span><span class="k">${</span><span class="nv">name</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"substring: </span><span class="k">${</span><span class="nv">name</span>:0:<span class="p"> -3</span><span class="k">}</span><span class="s2">"</span> <span class="c"># :- will take precedence as default value subsitution</span>


<span class="nb">echo</span> <span class="s2">"name with capital letter: </span><span class="k">${</span><span class="nv">name</span><span class="p">^</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"name with caps all: </span><span class="k">${</span><span class="nv">name</span><span class="p">^^</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"name with caps all: </span><span class="k">${</span><span class="nv">name</span><span class="p">@U</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"name with cap 1st A: </span><span class="k">${</span><span class="nv">name</span><span class="p">^a</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"name with cap all A:</span><span class="k">${</span><span class="nv">name</span><span class="p">^^a</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"name with cap all M,K: </span><span class="k">${</span><span class="nv">name</span><span class="p">^^[mk]</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="k">${</span><span class="nv">name</span><span class="p">,</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="k">${</span><span class="nv">name</span><span class="p">,,[mk]</span><span class="k">}</span><span class="s2">"</span>


<span class="nb">echo</span> <span class="s2">"replace a with u: </span><span class="k">${</span><span class="nv">name</span><span class="p">/u/a</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"replace a with u: </span><span class="k">${</span><span class="nv">name</span><span class="p">//u/a</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"replace a with uh: </span><span class="k">${</span><span class="nv">name</span><span class="p">//[uh]/a</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"replace with ____ </span><span class="k">${</span><span class="nv">name</span><span class="p">//[uh]/__&amp;__</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"replace with &amp; </span><span class="k">${</span><span class="nv">name</span><span class="p">//[uh]/__\&amp;__</span><span class="k">}</span><span class="s2">"</span>

<span class="nv">path</span><span class="o">=</span><span class="si">$(</span><span class="nb">pwd</span><span class="si">)</span>
<span class="nb">dirname</span> <span class="nv">$path</span>
<span class="nb">basename</span> <span class="nv">$path</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="k">${</span><span class="nv">path</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="k">${</span><span class="nv">path</span><span class="p">#*/</span><span class="k">}</span><span class="s2">"</span>      <span class="c"># from the beginning</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="k">${</span><span class="nv">path</span><span class="p">##*/</span><span class="k">}</span><span class="s2">"</span>     <span class="c"># from the beginning but find last occurance</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="k">${</span><span class="nv">path</span><span class="p">%/*</span><span class="k">}</span><span class="s2">"</span>      <span class="c"># from the end pick 1st / occurance &lt;print "starting to /"&gt;</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="k">${</span><span class="nv">path</span><span class="p">%/*</span><span class="k">}</span><span class="s2">"</span>
</code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/usr/bin/bash</span>
<span class="nv">name</span><span class="o">=</span><span class="k">${</span><span class="nv">1</span><span class="k">:-</span><span class="nv">default_val</span><span class="k">}</span>       <span class="c"># default value</span>
<span class="nb">echo</span> <span class="s2">"name: </span><span class="k">${</span><span class="nv">name</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="nt">-e</span> <span class="s2">"hello,</span><span class="se">\t</span><span class="k">${</span><span class="nv">name</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="nt">-e</span> <span class="s2">"hello,</span><span class="se">\v</span><span class="k">${</span><span class="nv">name</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="nt">-e</span> <span class="s2">"hello,</span><span class="se">\b</span><span class="k">${</span><span class="nv">name</span><span class="k">}</span><span class="s2">"</span>

<span class="nv">useros</span><span class="o">=</span><span class="k">${</span><span class="nv">1</span><span class="k">:-</span><span class="nv">$USER</span><span class="k">}</span>     <span class="c"># default assing if not passing</span>
<span class="nb">echo</span> <span class="s2">"hello, </span><span class="nv">$useros</span><span class="s2">!"</span>

<span class="nv">useros</span><span class="o">=</span><span class="k">${</span><span class="nv">1</span>:?<span class="s1">'You must pass name'</span><span class="k">}</span>         <span class="c"># show error if not passing</span>
<span class="nb">echo</span> <span class="s2">"hello, </span><span class="nv">$useros</span><span class="s2">!"</span>
</code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/usr/bin/bash</span>
<span class="nv">s</span><span class="o">=</span><span class="s2">"muthukamalan"</span>
<span class="nv">len</span><span class="o">=</span><span class="k">${#</span><span class="nv">s</span><span class="k">}</span>

<span class="k">for</span> <span class="o">((</span><span class="nv">i</span><span class="o">=</span>0<span class="p">;</span>i&lt;len<span class="p">;</span>i++<span class="o">))</span><span class="p">;</span> <span class="k">do
    </span><span class="nv">c</span><span class="o">=</span><span class="k">${</span><span class="nv">s</span>:i:1<span class="k">}</span>
    <span class="nb">echo</span> <span class="s2">"</span><span class="nv">$c</span><span class="s2">"</span>
<span class="k">done</span>
</code></pre></div></div>

<hr />

<h2 id="array-expansion">Array Expansion</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/usr/bin/bash</span>
<span class="nv">fam</span><span class="o">=(</span> kamalan revathi <span class="s2">"voc nagar"</span> <span class="o">)</span>
<span class="nb">printf</span> <span class="s1">'%s\n'</span> <span class="s2">"</span><span class="k">${</span><span class="nv">fam</span><span class="p">[@]</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">printf</span> <span class="s1">'%s\n'</span> <span class="s2">"</span><span class="k">${</span><span class="nv">fam</span><span class="p">[@]</span>:2<span class="k">}</span><span class="s2">"</span>
<span class="nb">printf</span> <span class="s1">'%s\n'</span> <span class="s2">"</span><span class="k">${</span><span class="nv">fam</span><span class="p">[@]1</span>:2<span class="k">}</span><span class="s2">"</span>
<span class="nb">printf</span> <span class="s1">'%s\n'</span> <span class="s2">"</span><span class="k">${</span><span class="nv">fam</span><span class="p">[@]//</span><span class="s1">'voc'</span><span class="p">/</span><span class="s1">'cvp'</span><span class="k">}</span><span class="s2">"</span>
<span class="o">(</span><span class="nv">IFS</span><span class="o">=</span>,<span class="p">;</span> <span class="nb">echo</span> <span class="s2">"</span><span class="k">${</span><span class="nv">fam</span><span class="p">[*]</span><span class="k">}</span><span class="s2">"</span><span class="o">)</span>
</code></pre></div></div>

<hr />

<h2 id="globbing">Globbing</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">ls</span> <span class="nt">-1</span> ./<span class="k">*</span>.md
<span class="nb">ls</span> <span class="nt">-1</span> ./<span class="k">*</span>.??

<span class="nb">shopt </span>extglob
<span class="nb">shopt</span> <span class="nt">-s</span> extglob  <span class="c"># turn on</span>
<span class="nb">shopt</span> <span class="nt">-u</span> extglob  <span class="c"># turn off</span>

<span class="nb">ls</span> <span class="nt">-1</span> ./!<span class="o">(</span><span class="k">*</span>.md<span class="o">)</span>
<span class="nb">ls</span> <span class="nt">-1</span> ./<span class="k">*</span>.+<span class="o">(</span>yml|md<span class="o">)</span>
</code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#/usr/bin/bash</span>
 <span class="nb">touch</span> <span class="o">{</span>foo,bar,baz<span class="o">}</span>.<span class="o">{</span>jpg,txt<span class="o">}</span>
<span class="nb">printf</span> <span class="s2">"&lt;%s&gt;</span><span class="se">\n</span><span class="s2">"</span> <span class="k">**</span>/<span class="k">*</span>
<span class="nb">echo</span> <span class="o">{</span>100..50..2<span class="o">}</span>
<span class="nb">seq </span>1 20
<span class="nb">seq </span>10
</code></pre></div></div>

<hr />

<h2 id="brace-expansion">brace Expansion</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#/usr/bin/bash</span>
<span class="nb">printf</span> <span class="s1">'%s\n'</span> <span class="o">{</span>cvp,tn,india<span class="o">}</span>
<span class="nb">printf</span> <span class="s1">'%s\n'</span> <span class="s2">"{cvp,tn,india}"</span>
<span class="nb">printf</span> <span class="s1">'%s\n'</span> tmp/files/<span class="o">{</span>cvp,tn,india<span class="o">}</span>.<span class="o">{</span>jpg,txt<span class="o">}</span>
<span class="nb">printf</span> <span class="s1">'%s\n'</span> tmp/files/<span class="k">*</span>.<span class="o">{</span>jpg,txt<span class="o">}</span>

<span class="nv">fname</span><span class="o">=</span><span class="s2">"pl-"</span>
<span class="nv">place</span><span class="o">=(</span> <span class="s2">"</span><span class="nv">$fname</span><span class="s2">."</span><span class="o">{</span>txt,jpg,mov<span class="o">}</span> <span class="o">)</span>
<span class="k">for </span>i <span class="k">in</span> <span class="s2">"</span><span class="k">${</span><span class="nv">place</span><span class="p">[@]</span><span class="k">}</span><span class="s2">"</span><span class="p">;</span> <span class="k">do
    </span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$i</span><span class="s2">"</span>
<span class="k">done</span>
</code></pre></div></div>

<hr />

<h2 id="printf">printf</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/usr/bin/bash</span>

<span class="c"># printf supports  csndiouxXeEfFgGaA</span>
<span class="nb">printf</span> <span class="s1">'&lt;%-5s&gt; %10s\n'</span> hello, world
<span class="nb">printf</span> <span class="s1">'%*s  %5s\n'</span> 100 hello, world
<span class="nb">printf</span> <span class="s1">'%d\n'</span> 100
<span class="nb">printf</span> <span class="s1">'%05d\n'</span> 100
<span class="nb">printf</span> <span class="s1">'%05d\n'</span> error <span class="c">#=&gt; error</span>

<span class="nb">printf</span> <span class="nt">-v</span> x <span class="s1">'hello, %s'</span> world!
<span class="nb">echo</span> <span class="nv">$x</span>  <span class="c"># "hello, world!"</span>
</code></pre></div></div>

<hr />

<h2 id="date">Date</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">date
date</span> +%s  <span class="c"># strftime</span>
<span class="nv">datefmt</span><span class="o">=</span><span class="s1">'%Y-%m-%d %H:%M:%S'</span>
<span class="nb">printf</span> <span class="s1">'%(%Y-%m-%d %H:%M:%S)T\n'</span>

<span class="nb">printf</span> <span class="s1">'%(%Y-%m-%d %H:%M:%S)T  name=%2s\n'</span> <span class="nt">-1</span> muthu  <span class="c"># -1 represent last word</span>
</code></pre></div></div>

<hr />

<h2 id="ssh-hardening">SSH Hardening</h2>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Edit SSH config</span>
<span class="nb">sudo </span>vim /etc/ssh/sshd_config
<span class="c"># Set: PermitRootLogin no, Port 2222</span>
<span class="nb">sudo </span>systemctl reload sshd

<span class="c"># Key-based auth</span>
ssh-keygen <span class="nt">-t</span> rsa <span class="nt">-b</span> 4096
ssh-copy-id devops@server
</code></pre></div></div>
<hr />

<h2 id="trap-signals">Trap Signals</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">trap</span> <span class="nt">-l</span>
</code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/usr/bin/bash</span>
cleanup<span class="o">(){</span>
    <span class="nb">echo </span>cleanup <span class="k">function </span>running
    <span class="nb">exit </span>0
<span class="o">}</span>
<span class="nb">trap </span>cleanup <span class="nb">exit</span>           <span class="c"># On exit signal, cleanup fn will  run  similar to defer()</span>

<span class="nb">echo </span>script starting....
<span class="nb">echo</span> ....
<span class="nb">echo </span>script <span class="k">done</span><span class="o">!</span>
</code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/usr/bin/bash</span>
debuggs<span class="o">(){</span>
    <span class="nb">echo</span> <span class="s2">"[debug] running: </span><span class="nv">$BASH_COMMAND</span><span class="s2">"</span>   <span class="c"># similar to "bash -x script"</span>
    <span class="nb">exit </span>0
<span class="o">}</span>
<span class="nb">trap </span>debuggs debug
<span class="nb">echo </span>script starting....
<span class="nb">echo</span> ....
<span class="nb">echo </span>script <span class="k">done</span><span class="o">!</span>
</code></pre></div></div>

<hr />

<h2 id="permissions">Permissions</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/usr/bin/bash</span>
<span class="k">**********</span>

<span class="c"># * d/-  # directory or file</span>
<span class="c"># ***  read write execute rwx  # owner</span>
<span class="c"># *** # group</span>
<span class="c"># *** # everyone</span>
</code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">LC_COLLATE</span><span class="o">=</span>C <span class="nb">ls</span> <span class="nt">-alh</span> <span class="nt">--group-directories-first</span> <span class="nt">--color</span><span class="o">=</span>auto <span class="c">#list all in the current dir. LC_COLLATE=C set of rule recognizing only the US English alphabet — "a-z" and "A-Z" — as "letters", and sorting by byte value</span>
</code></pre></div></div>

<hr />

<h2 id="logs-monitoring-and-troubleshooting">Logs, Monitoring and Troubleshooting</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>top
htop
<span class="nb">uptime
</span>w
lscpu <span class="c"># system's CPU in use</span>
<span class="c"># Architecture:             x86_64</span>
<span class="c"># Socket(s):                1      sockets are physical slots on motherboard where we can insert physical cpu. Socket enables communication between two process</span>
<span class="c"># Core(s) per socket:       8      each socket will have 8 cores</span>
<span class="c"># Thread(s) per core:       2      each core will run 2 threads at the same time</span>

<span class="c"># So, Total number of virtual CPU = Sockets x Cores x Threads</span>
<span class="c"># CPU(s):                    16</span>

lsmem <span class="nt">--summary</span>
free <span class="nt">-g</span>

lshw                    <span class="c"># List Hardware</span>

<span class="nb">du</span> <span class="nt">-lsh</span> filename        <span class="c"># size of the file</span>
<span class="nb">du</span> <span class="nt">-sh</span> /var/<span class="k">*</span>  <span class="c"># disk usage</span>
</code></pre></div></div>

<h2 id="file-compression">File compression</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">tar</span> <span class="nt">-cf</span> file.tar f1 f2 f3   <span class="c"># *.tar called as tarballs  -c:create -f:name-of-file</span>
<span class="nb">tar</span> <span class="nt">-tf</span> file.tar            <span class="c"># see content of tarball</span>
<span class="nb">tar</span> <span class="nt">-xf</span> file.tar            <span class="c"># extract content</span>
<span class="nb">tar</span> <span class="nt">-zcf</span> file.tar f1 f2 f3  <span class="c"># compress tarball to reduce size</span>
</code></pre></div></div>

<hr />

<h2 id="check-service-and-manage-daemin">Check Service and manage daemin</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl <span class="nt">--help</span>
systemctl list-units <span class="nt">--all</span> <span class="nt">--type</span><span class="o">=</span> <span class="c"># service, socket path</span>
systemctl list-dependencies

<span class="k">if </span>systemctl is-active <span class="nt">--quiet</span> nginx<span class="p">;</span> <span class="k">then </span><span class="nb">echo</span> <span class="s2">"Nginx is running"</span><span class="p">;</span> <span class="k">fi</span>


<span class="c"># Service logs</span>
dmesg | <span class="nb">tail</span>  <span class="c"># Kernel messages</span>
journalctl <span class="nt">-xb</span>  <span class="c"># Boot logs</span>
journalctl u nginx
journalctl <span class="c">#  use journalctl to view and follow the system's journald log entries, which resides in /run/log/journal.</span>


runlevel <span class="c"># 5:: Boots into graphical interface and 3:: No-GUI</span>
systemctl get-default  <span class="c"># graphical.target</span>
<span class="c"># runlevel 0 -&gt; poweroff.target</span>
<span class="c"># runlevel 1 -&gt; rescue.target</span>
<span class="c"># runlevel 2 -&gt; multi-user.target</span>
<span class="c"># runlevel 3 -&gt; multi-user.target</span>
<span class="c"># runlevel 4 -&gt; multi-user.target</span>
<span class="c"># runlevel 5 -&gt; graphical.target</span>
<span class="c"># runlevel 6 -&gt; reboot.target</span>


<span class="c"># Run a process in background</span>
<span class="nb">nohup </span>python3 app.py 
./script.sh &amp;


<span class="c"># Kill process</span>
<span class="nb">kill </span>1234         <span class="c"># By PID</span>
killall python3   <span class="c"># By name</span>
pkill <span class="nt">-f</span> <span class="s2">"app.py"</span> <span class="c"># By pattern</span>

</code></pre></div></div>

<hr />

<h2 id="network-essentials">Network Essentials</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">hostname</span>        <span class="c"># managed under /etc/hostname</span>
hostnamectl     <span class="c"># /etc/hosts</span>

ping <span class="nt">-c4</span> google.com  <span class="c"># ping utility helps for connectivity checking</span>

ip route <span class="c">#</span>
info ip
ss <span class="nt">-tulp</span>
netstat <span class="nt">-tunpl</span>
lsof
lsof <span class="nt">-i</span> :80 <span class="c"># find process y port</span>
lspci <span class="c"># list all pci cards like ethernet card, video cards (peripheral component interconnect)</span>


lsblk <span class="c"># list all physical disks space &lt;sda&gt; and partitions are sda1,sda2,sda3..</span>

<span class="c"># Trace route</span>
traceroute google.com
mtr <span class="nt">--report</span> google.com  <span class="c"># Real-time</span>

<span class="c"># View network interfaces</span>
ip addr show
ip <span class="nb">link </span>show
</code></pre></div></div>

<hr />

<h2 id="processes">Processes</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># List the current active process with their statuses, numbers, resource usage, etc.</span>
ps auxc   <span class="c">#  # All processes</span>
ps <span class="nt">-ef</span> | <span class="nb">grep </span>nginx <span class="c"># Filter By Name</span>
<span class="nb">fg
jobs
bg</span> <span class="c">#%id</span>
</code></pre></div></div>

<hr />

<h2 id="cron">CRON</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>crontab <span class="nt">-l</span>
crontab <span class="nt">-e</span>
<span class="c"># *seconds(0-59) *min(0-59) *hour(0-23) *day-of-month(1-31) *month(1-12) *day-of-week(0-7:: sunday=0 or 7) *year[optional]  *cmd</span>
<span class="c"># 0 5 * * * /usr/bin/backup.sh</span>

<span class="c"># Alternative systemd.timers</span>
</code></pre></div></div>
<hr />

<h2 id="service-management-with-systemd">Service management with SYSTEMD</h2>

<p>Systemd Tools</p>

<ul>
  <li>Systemctl</li>
  <li>journelctl</li>
</ul>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Systemctl</span>
- Mange system state
- start/stop/restart/reload
- <span class="nb">enable</span>/disable
- list and manage units
- list and update targets
</code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>journalctl
journalctl <span class="nt">-b</span> <span class="c"># logs for current boot</span>
journalctl <span class="nt">-u</span> UNIT <span class="c"># particular unit</span>
</code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># It should created in /etc/systemd/system/servicename.service</span>

<span class="o">[</span>Unit]
<span class="nv">Description</span><span class="o">=</span>Postgresql <span class="k">for </span>Py3
<span class="nv">Documentation</span><span class="o">=</span>http://github.com/muthu/postgresql
<span class="nv">After</span><span class="o">=</span>postgresql.service

<span class="o">[</span>Service]
<span class="nv">ExecStart</span><span class="o">=</span> /bin/bash /usr/bin/filename.sh
<span class="nv">User</span><span class="o">=</span>
<span class="nv">Restart</span><span class="o">=</span>on-failure
<span class="nv">RestartSec</span><span class="o">=</span>10

<span class="o">[</span>Install]
WantedBy graphical.target   <span class="c">#systemctl get-default</span>

<span class="c"># starts with following `systemctl start servicename.service`</span>
<span class="c"># check the status `systemctl status servicename.service`</span>
<span class="c"># Stop the service `systemctl stop servicename.service`</span>
<span class="c"># reload services `systemctl daemon-reload`</span>

</code></pre></div></div>
<hr />

<h2 id="storage-in-linux">Storage in Linux</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># - Disk partitions</span>
lsblk
fdisk <span class="nt">-l</span> /dev/sda

<span class="nb">df</span> <span class="nt">-h</span> <span class="c"># check disk usage </span>

<span class="c"># Parition Types:- Primary, Extended and Logical</span>
<span class="c"># Parition Schema:- MBR(old), GPT(new:: unlimited partition, no-max size)</span>
<span class="c"># gdisk /dev/diskname</span>
</code></pre></div></div>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># LOG ROTATE</span>
<span class="nb">sudo </span>vim /etc/logrotate.d/myapp
<span class="c"># Add:</span>
/var/log/myapp/<span class="k">*</span>.log <span class="o">{</span>
    daily
    rotate 7
    compress
<span class="o">}</span>
</code></pre></div></div>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Create partition</span>
<span class="nb">sudo </span>parted /dev/sdb mklabel gpt
<span class="nb">sudo </span>parted /dev/sdb mkpart primary ext4 0% 100%

<span class="c"># Create filesystem</span>
<span class="nb">sudo </span>mkfs.ext4 <span class="nt">-L</span> Data /dev/sdb1

<span class="c"># Mount filesystem</span>
<span class="nb">sudo mkdir</span> /data
<span class="nb">sudo </span>mount /dev/sdb1 /data
<span class="nb">echo</span> <span class="s2">"UUID=</span><span class="si">$(</span><span class="nb">sudo </span>blkid <span class="nt">-s</span> UUID <span class="nt">-o</span> value /dev/sdb1<span class="si">)</span><span class="s2"> /data ext4 defaults 0 2"</span> | <span class="nb">sudo tee</span> <span class="nt">-a</span> /etc/fstab

<span class="c"># Create LVM</span>
<span class="nb">sudo </span>pvcreate /dev/sdb1
<span class="nb">sudo </span>vgcreate vg_data /dev/sdb1
<span class="nb">sudo </span>lvcreate <span class="nt">-L</span> 10G <span class="nt">-n</span> lv_web vg_data
<span class="nb">sudo </span>mkfs.ext4 /dev/vg_data/lv_web
<span class="nb">sudo </span>mount /dev/vg_data/lv_web /var/www

<span class="c"># Create RAID</span>
<span class="nb">sudo </span>mdadm <span class="nt">--create</span> /dev/md0 <span class="nt">--level</span><span class="o">=</span>1 <span class="nt">--raid-devices</span><span class="o">=</span>2 /dev/sdb1 /dev/sdc1
<span class="nb">sudo </span>mkfs.ext4 /dev/md0
<span class="nb">sudo </span>mount /dev/md0 /mnt/raid
</code></pre></div></div>
<hr />
<h2 id="create-and-managing-users">Create and Managing Users</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># create user</span>
<span class="nb">sudo </span>useradd <span class="nt">-m</span> <span class="nt">-s</span> /bin/bash devops  <span class="c"># With home dir and shell</span>
<span class="nb">sudo </span>passwd devops  <span class="c"># Set password</span>

<span class="c"># Create group</span>
<span class="nb">sudo </span>groupadd developers

<span class="c"># Add user to group</span>
<span class="nb">sudo </span>usermod <span class="nt">-aG</span> developers devops

<span class="c"># Modify user</span>
<span class="nb">sudo </span>usermod <span class="nt">-L</span> devops  <span class="c"># Lock account</span>
<span class="nb">sudo </span>usermod <span class="nt">-U</span> devops  <span class="c"># Unlock account</span>
<span class="nb">sudo </span>usermod <span class="nt">-c</span> <span class="s2">"DevOps User"</span> devops  <span class="c"># Set comment</span>

<span class="c"># Delete user</span>
<span class="nb">sudo </span>userdel <span class="nt">-r</span> devops  <span class="c"># Remove user and home dir</span>


<span class="c">#####</span>
<span class="c"># Set sudo privileges</span>
<span class="nb">sudo </span>visudo
<span class="c"># Add: devops ALL=(ALL) NOPASSWD:ALL  # Passwordless sudo</span>

<span class="c"># View users and groups</span>
<span class="nb">id</span> <span class="sb">`</span>user<span class="sb">`</span>  <span class="c"># User and group info</span>
getent passwd  <span class="c"># List all users</span>
getent group    <span class="c"># Group all members  `getent group devlops` -&gt; developers group </span>


<span class="nb">sudo cp</span> .bashrc /etc/skel/.bashrc  <span class="c"># customize new user home dir</span>
</code></pre></div></div>]]></content><author><name>Muthu Kamalan</name></author><category term="blog" /><category term="work" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Secrets of Life</title><link href="https://github.com/blog/secrets-of-life/" rel="alternate" type="text/html" title="Secrets of Life" /><published>2022-12-12T00:00:00+00:00</published><updated>2022-12-12T00:00:00+00:00</updated><id>https://github.com/blog/secrets-of-life</id><content type="html" xml:base="https://github.com/blog/secrets-of-life/"><![CDATA[<p><img src="/../assets/2026-07-27-secrets-of-life/default-thumbnail.png" alt="secrets" /></p>

<p>எங்கோ ஒரு மோட்டு வளர்ந்து மலர்ந்து படர்ந்து பரந்து <br />
தேன்றல் தான் விசிட மேகம் தான் தாண்டிட<br />
வாசமரியா கானகத்தில் தேசமரியா விழுந்தது <br />
காலம் சில கடந்தது <br />
கனவுகள் சில மறந்தது <br />
தேன்றல் தான் வந்திடுமோ தெய்வம் தான் காத்திடுமோ என தேம்மாத நாள் இல்லை <br />
ஓடதா ஒரு நதி ஒன்றாய் ஆக <br />
காணாத அப்பறவைகள் களித்தன கொண்டாட்டத்தில் <br />
தீராது இந்நாள் தினம் தினம் வந்திடவே  <br />
கூராத அதன் காதல் மெய்யாய் ஆகும்!  <br /></p>

<hr />

<p>எப்படி பறப்பது என்று பறவையிடம் கேட்டேன். <br />
உட்கார்ந்து சொல்ல தெரியாது என்னுடன் பற என்றது. <br />
எப்படி தொடர்ந்து பறப்பது என்று கேட்டேன், <br />
இப்படி தான் என்றது 🕊️✨</p>]]></content><author><name>Muthu Kamalan</name></author><category term="blog" /><category term="personal" /><category term="writing" /><summary type="html"><![CDATA[As long as I live, there are infinite chances!]]></summary></entry><entry><title type="html">Beauty of Life</title><link href="https://github.com/blog/beauty-of-life/" rel="alternate" type="text/html" title="Beauty of Life" /><published>2021-11-12T00:00:00+00:00</published><updated>2021-11-12T00:00:00+00:00</updated><id>https://github.com/blog/beauty-of-life</id><content type="html" xml:base="https://github.com/blog/beauty-of-life/"><![CDATA[<p><img src="/../assets/2026-07-27-beauty-of-life/default-thumbnail.jpg" alt="beauty-of-life" /></p>

<p>காண கண் கோடி இடங்கள் வைத்தாய் <br />
கண்கள் ஏனோ இரண்டை படைத்தாய்<br />
இரண்டு 👀 கண்கள் போதாது எனவே முக்காலம்⏳ படைத்தாய்!!<br />
இருப்பினும் ஏனோ முதுமை படைத்தாய்!! <br />
எத்தனை கோடி இன்பம் படைத்தாய் <br />
எனினும் எளிமை என் படைத்தான் - <br />
அதை என்னுள் வைத்தாய்!! <br />
இதயம் ஒன்றே 💖 படைத்தாய் எனினும் இன்னல் நூறு படைத்தாய்!! <br />
இன்னும் எத்தனை ஆண்டு இந்த ஒப்பனை நாடகங்கள் 🎭 <br />
எந்த இலைகளும் 🍃 காற்றைப் பிடித்து வைத்துக்கொள்ளவில்லை <br />
ஏந்த காற்றும் இலையில் தங்க போவதுமில்லை <br />
ஆனாலும் அங்கே காதலுக்கு ஒரு குறைவுமில்லை!! <br /></p>

<hr />

<p>இறுதியில் தனியாக வாடதான் 🍂 போகிறோம் <br />
இருப்பினும் <br />
வளராமல்… 🍃 <br />
தளிராமல்.. 🌾 <br />
நறுமணம் பரப்பாமல் இருக்க அவசியமில்லை 🌻✨</p>]]></content><author><name>Muthu Kamalan</name></author><category term="blog" /><category term="personal" /><category term="writing" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Being Human</title><link href="https://github.com/blog/being-human/" rel="alternate" type="text/html" title="Being Human" /><published>2019-11-05T00:00:00+00:00</published><updated>2019-11-05T00:00:00+00:00</updated><id>https://github.com/blog/being-human</id><content type="html" xml:base="https://github.com/blog/being-human/"><![CDATA[<p><img src="/../assets/2026-07-27-being-human/default-thumbnail.jpg" alt="human" /></p>

<p>அடிக்கடி தவறு செய்பவன் அப்பாவி 🥺<br />
ஒரே தவறை திரும்பத் திரும்பச் செய்பவன் முட்டாள் 🤪<br />
ஒரு தவறுமே செய்யாதவன் மரக்கட்டை 🪵 <br />
தன்னை அறியாமல் தவறு செய்து பின் தன்னையறிந்து
திருத்தி கொள்பவன் மனிதன் 🤗</p>]]></content><author><name>Muthu Kamalan</name></author><category term="blog" /><category term="personal" /><category term="writing" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">breath</title><link href="https://github.com/blog/breath/" rel="alternate" type="text/html" title="breath" /><published>2014-05-29T00:00:00+00:00</published><updated>2014-05-29T00:00:00+00:00</updated><id>https://github.com/blog/breath</id><content type="html" xml:base="https://github.com/blog/breath/"><![CDATA[<p><img src="/../assets/2026-07-27-breath/default-thumbnail.png" alt="breath" /></p>

<p>When you give things space to breathe and be as they are without force, <br />
they fall into the right places and serve you the best.<br />
When we try to use our will to make things be a certain way, <br />
we cause more chaos than peace.<br />
Trust that things will fall into the perfect place and do things honestly.</p>]]></content><author><name>Muthu Kamalan</name></author><category term="blog" /><category term="personal" /><category term="book summary" /><category term="writing" /><category term="relax" /><category term="poem" /><summary type="html"><![CDATA[]]></summary></entry></feed>